﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-只有有耐心圆满完成简单工作的人，才能够轻而易举地完成困难的事。-随笔分类-心路历程</title><link>http://www.cppblog.com/leetaolion/category/4830.html</link><description>Only those who have the patience to do simple things perfectly ever acquire the skill to do difficult things easily. </description><language>zh-cn</language><lastBuildDate>Wed, 21 May 2008 05:58:59 GMT</lastBuildDate><pubDate>Wed, 21 May 2008 05:58:59 GMT</pubDate><ttl>60</ttl><item><title>我是笨人——读Rob Pike的《Notes on C Programming 》（附全文链接）</title><link>http://www.cppblog.com/leetaolion/archive/2008/02/29/43429.html</link><dc:creator>创建更好的解决方案</dc:creator><author>创建更好的解决方案</author><pubDate>Fri, 29 Feb 2008 00:39:00 GMT</pubDate><guid>http://www.cppblog.com/leetaolion/archive/2008/02/29/43429.html</guid><wfw:comment>http://www.cppblog.com/leetaolion/comments/43429.html</wfw:comment><comments>http://www.cppblog.com/leetaolion/archive/2008/02/29/43429.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/leetaolion/comments/commentRss/43429.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/leetaolion/services/trackbacks/43429.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Ken Thompson —— Unix 最初版本的设计者和实现者，禅宗偈语般地对 Pike 的原则4 作了强调：拿不准就穷举 <br>花哨的算法比简单算法更容易出 bug 、更难实现。尽量使用简单的算法配合简单的数据结构。<br>只要掌握了数据结构中的四大法宝，就可以包打天下，他们是：array 、linked list 、hash table、binary tree 。这四大法宝可不是各自为战的，灵活结合才能游刃有余。比如，一个用hash table组织的symbol table，其中是一个个由字符型array构成的linked list。&nbsp;&nbsp;<a href='http://www.cppblog.com/leetaolion/archive/2008/02/29/43429.html'>阅读全文</a><img src ="http://www.cppblog.com/leetaolion/aggbug/43429.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/leetaolion/" target="_blank">创建更好的解决方案</a> 2008-02-29 08:39 <a href="http://www.cppblog.com/leetaolion/archive/2008/02/29/43429.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对工作性质的认识</title><link>http://www.cppblog.com/leetaolion/archive/2008/01/23/41736.html</link><dc:creator>创建更好的解决方案</dc:creator><author>创建更好的解决方案</author><pubDate>Wed, 23 Jan 2008 10:31:00 GMT</pubDate><guid>http://www.cppblog.com/leetaolion/archive/2008/01/23/41736.html</guid><wfw:comment>http://www.cppblog.com/leetaolion/comments/41736.html</wfw:comment><comments>http://www.cppblog.com/leetaolion/archive/2008/01/23/41736.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/leetaolion/comments/commentRss/41736.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/leetaolion/services/trackbacks/41736.html</trackback:ping><description><![CDATA[老董：最近忙什么呢，这句最常用的问候<br>小李：每天写代码<br>老董：小李，你对工作性质的认识不对，你是在设计软件，不是在写代码<br>小李：我是不好意思说我在设计软件<br>其实小李知道我是在设计软件<br>是在狡辩吗<br>告诉别人自己每天都在写代码，其实自己一直当自己在设计软件<br>这就是中国式的表里不一
<img src ="http://www.cppblog.com/leetaolion/aggbug/41736.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/leetaolion/" target="_blank">创建更好的解决方案</a> 2008-01-23 18:31 <a href="http://www.cppblog.com/leetaolion/archive/2008/01/23/41736.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我和充斥臭味代码的战争</title><link>http://www.cppblog.com/leetaolion/archive/2008/01/12/41020.html</link><dc:creator>创建更好的解决方案</dc:creator><author>创建更好的解决方案</author><pubDate>Sat, 12 Jan 2008 05:00:00 GMT</pubDate><guid>http://www.cppblog.com/leetaolion/archive/2008/01/12/41020.html</guid><wfw:comment>http://www.cppblog.com/leetaolion/comments/41020.html</wfw:comment><comments>http://www.cppblog.com/leetaolion/archive/2008/01/12/41020.html#Feedback</comments><slash:comments>23</slash:comments><wfw:commentRss>http://www.cppblog.com/leetaolion/comments/commentRss/41020.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/leetaolion/services/trackbacks/41020.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 从去年8月份到现在，我一直在从事一个261k行代码的项目（不含空行和注释）。<br>其中由我本人编写的代码10.9k行（不含空行和注释，我本人所写的注释大约1/8有效代码行，属于比较少的）。<br>TDD的老爹Kent说如果已经有可以运行的代码，这时候是不适合引入TDD的。对已经可以运行的261k行代码重新写测试用例，怕是要出人命的。我想Kent老爹说的是老代码从新TDD，言之有理，对于一个成年人你来T他的小DD，当然就要踢出大事情来。但是对于一些新模块，或者说是老模块需要彻底修改（几乎全部抛弃）的时候，年轻人吗，从小开始T他的小DD，慢慢培养，说不定能T出一个会铁裆功的模块来，到时候岂不是天下无敌了。&nbsp;&nbsp;<a href='http://www.cppblog.com/leetaolion/archive/2008/01/12/41020.html'>阅读全文</a><img src ="http://www.cppblog.com/leetaolion/aggbug/41020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/leetaolion/" target="_blank">创建更好的解决方案</a> 2008-01-12 13:00 <a href="http://www.cppblog.com/leetaolion/archive/2008/01/12/41020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一次独立开发的体会</title><link>http://www.cppblog.com/leetaolion/archive/2007/08/02/29229.html</link><dc:creator>创建更好的解决方案</dc:creator><author>创建更好的解决方案</author><pubDate>Thu, 02 Aug 2007 13:09:00 GMT</pubDate><guid>http://www.cppblog.com/leetaolion/archive/2007/08/02/29229.html</guid><wfw:comment>http://www.cppblog.com/leetaolion/comments/29229.html</wfw:comment><comments>http://www.cppblog.com/leetaolion/archive/2007/08/02/29229.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/leetaolion/comments/commentRss/29229.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/leetaolion/services/trackbacks/29229.html</trackback:ping><description><![CDATA[<p>一次独立开发的体会<br>by leetaolion<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;很长时间以来，自己都是一个靠着改别人的程序过日子的人。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;前一段时间终于有机会独立开发一个模块，有一些感慨，记录下来。主要是为了给自己在某个不清醒的时候泼一瓢冷水，更有人欣赏的话，帮忙添加写评论，帮点迷津。<br>首先还是按照时间的先后顺序来反省吧。其实写出反省是老大不情愿的，反省是一方面，主要还是为了惩前毖后，治病救人嘛。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;整个模块的需求的提出和整体的思路并不是我提出来的，而是由别的项目组提出来的，我只是借用了人家的思想，实现了一下，实现了人家思想的雏形。至于完备的实现，怕是没有人拿鞭子抽我，我是不会主动去做的。这正验证了那句话，如果没有设计文档的约束，开发人员会越来越偷懒，哪怕是最老实的开发人员，也会想尽办法偷工减料。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;需求分析，是一个很讲究经验、技巧的阶段，以前我认为需求分析做得好的人不一定是编程非常棒的人，当时在一个小的团队里，我的想法是错的。要把需求分析做好，那好的需求分析结果是什么洋子的呢？有什么特征，比如说两个脑袋之类，让人过目不忘的特征？或是琅琅上口那种？<br>总结一下撒：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;好的需求分析，不是简单的总结，更重要的是分析，来源于用户的需求，又高于用户的需求。这样说有点太玄了，就是需求分析总结出来的功能点，不单要覆盖到用户的直接需求，还要为用户的次生需求提供足够的扩展空间。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;分析的结果要记录在案，免得自己日后不认账。需要一种监督的力量，这种力量是很难得的，最靠谱的做法是群发给所有人，这样就在别人那里记下了一笔账，等你提交Demo版本的时候，大家都掏出账本，一笔一笔的兑现。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设计是回答需求分析归纳出来的功能点，一个功能点就是一个问题，设计就是回答这些问题。<br>问题的回答首先有个大纲，这个跟写作文一个道理，HOHO，我写作文从来不写大纲，所以小学初中的时候天马星空，深得老师赞赏，到了高中就废废了，sigh。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;概要设计就是这个大纲，所谓大纲，可以浪漫些，理想主义一些，把软件想的完美一些，如果是设计完了是自己来实现，怕是多数人不会选择这种风格，怕是实现不了，或者实现起来很难，岂不是搬起石头来砸自己的脚。所以，很大程度上要靠责任心，这年月，什么最贵？责任心。其实，只要设计出来，实现都是没有问题的，以上的一些逃避的想法，其实是对自己的技术不够自信导致的，是一种对于未知世界的恐惧敢在作怪。对付这种恐惧，别无他法，只有武装自己。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这一步也要记录在案，不然，本来就捉襟见肘的设计，最后在偷懒的本性的剥蚀下，会变得惨不忍睹。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;概要设计列好了大纲，下面是详细设计。详细设计阶段对设计人员有一个要求，就是在这时候，设计者应该能透过概要设计画出的蓝图，看到实现的细节，甚至是具体代码。要不然，如何定义接口呢？在接口的设计上是有一些惨痛代价的，能犯的错误，基本上一个不拉。设计到最后，大量的重名函数，由个更名带来的接口污染，由于态度暧昧造成返回值类型的滥用，接口类型的不确定，参数时多时少，总是不恰好。尤其是到了编码阶段，如果这些地方出现错误你算算需要维护多少分文件，实现文件算一份，头文件一份，接口文件一份，再加上开发文档、类图，牵一发动全身，一处错误，到处修改（貌似Java的特性）。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这些都是教训，那经验呢？<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我想，如果有一个东西能控制这整个过程，那就是类图吧。类图修改起来容易，而且很直观，如果要用好类图，就不要吝啬你的脑细胞，整个操作流程设计的细枝末节都要细细斟酌，这样才算没有糟蹋UML这样一把牛刀。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果有凌波微步的功夫把前面三步走都走的很潇洒的话，后面的工作可以说是水到渠成了。可惜，这样的功夫我暂时还不具备，摔了几跤，爬起来，拍拍身上的泥土，擦干净身上的狗屎，继续前进。<br>到了编码这一步，我的最大体会就是，如果你没有把前面几步蹚明白就贸然走进这一步的话，会碰得灰头土脸。不要怕过度的设计，现在的问题是设计不够，说明白点，就是没有在设计阶段，把全部的精力都放在设计上。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在编写代码的第一步编写测试用例，我想多数人接触这个东西的时候心里都是感觉怪怪的，老是想着，我的button+label的法宝不是屡试不爽的吗，干嘛要这劳什子。试用之后，发现这是个有远见的好点子。首先人家实现了科学管理，试想一个全部靠button+label实现的测试，测完之后不知道扔到那个废纸堆了。用工程来管理测试用例，形式上是一种进步。实质上呢，当联调的时候发现问题，逐个跑一下测试用例，很快定位错误所在，这时候你才能体会到当年的辛苦是值得的。其实这些只是享受到这些方面的便利，就好比是买了一大块巧克力，舔一舔就扔掉了，浪费大了去了。人家设计这种开发模式的初衷是为了更好地在编码中体现设计的指导作用，更好地贯彻设计指导开发的思想。当然，这一点暂时还没有深入我心，我只是在一个接口不多的小模块上实践了这种模式。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一开始不进行代码版本控制，出现代码管理混乱，常常分不清哪里是新代码，哪里是老代码。翻了半天，要靠右键属性通过时间来判别，有时候文件夹乱放，每一次都要翻箱倒柜。还好，星之队拯救了我。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当然，还是有一些好的经验的，比如常常召唤出两个胜利女神来，一个正常开发，一个快速的button+label验证对xx的小想法。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最大的问题还是对时间的控制，控制好时间，就控制了一切。</p>
<img src ="http://www.cppblog.com/leetaolion/aggbug/29229.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/leetaolion/" target="_blank">创建更好的解决方案</a> 2007-08-02 21:09 <a href="http://www.cppblog.com/leetaolion/archive/2007/08/02/29229.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>