博客

  • Why we need unittest?

    这是我给team member写的一封邮件,感觉很有通用性,值得推广给各位。
    我们的项目主要是以COM interface形式被其它软件使用,所以我写了一个ProjectAutoTest项目来实现功能测试。
    ProjectAutoTest通过config.txt这样的文本形式配合一些必要文件来定义测试用例,实现了不增加修改代码就可引入新测试用例的目的。

    因为针对的不是内部代码而是COM接口,严格的说算不上单元测试。
    但是,ProjectAutoTest可以帮助我提高软件质量,检测潜在的问题,就足够了。

    “Why we need unittest? it wastes time”

    Why we need unittest, because we need good code quality.

    1) The issue comes from ProjectA, and changes in our project.
    And AAA told me why it happens and debug with project,
    but we can’t repeat this step in every code change.

    2) Which files are affected, how to duplicate the issue more simple more easy?
    The unittest of ProjectAutotest is most easy way to get it.

    3) When we fix the issue for ProjectA, for ProjectB,
    it maybe affects our projects or others in same time. How could we know the change good or bad?
    Whether this change affect other defects?

    It is just my suggestion, but if you want to keep the code quality of our project,
    Following steps will be good way to do, and
    I have mentored BBB, CCC to follow the rule, it is not difficult.

    ====================================
    Step1) duplicate the issue with Defect description.

    Step2) convert the issue to ProjectAutoTest testcase. There must be one or two files.
    There must be one or more interface function are called.
    There have incorrect result or no output.

    Step3) run your new adding testcase, it should be able to duplicate the issue too.
    If some incorrect result is output, the incorrect result should same as Defect issue too.

    Step4) Fix the bug. Find the root cause.

    Step5) Change the code, and try with the testcase in ProjectAutoTest.
    It should get correct result.

    Step6) Test with all testcases in ProjectAutoTest, results should be correct too.

    Step7) Test with Defect duplication steps. It should be correct too.

    Step8) Check in the code, and change Defect state.

    !!! Note: the testcase in ProjectAutoTest should be checked in too.
    The testcase must be maintained same as source code, and consider the testcase as same importance too.

    For the code review, it should have changed code, and new testcase in same time.

  • 一些有用的开源project

    主要是Google AppEngine上的(GAE):twitter相关;multi-chat相关;飞信或者短信相关。
    还有新浪SinaAppEngine及新浪微博相关。

    http://code.google.com/p/youngking/downloads/detail?name=mail2sms_beta_20100919.zip&can=2&q=

    http://code.google.com/p/pranav

    https://code.google.com/p/channel-tac-toe/

    *** mirrorrr-plus

    twitter-oauth-login-proxy

    jaikuengine

    jsonbot

    twitteroauth-python

    http://code.google.com/p/gtap

    *** google-app-engine-samples/multi-chat

    http://github.com/superfeedr/notifixlight

    *** google-app-engine-samples/crowdguru

    twitalker

    *** https://github.com/gh05tw01f/twitalkerplus

    *** gae-rproxy

    https://github.com/metachris/feedmailer

    https://github.com/crabasa/Twitter2Mail

    http://code.google.com/p/appengine-mapreduce/

    http://code.google.com/p/gae-bbs/

    https://bitbucket.org/keakon/yui/

    https://bitbucket.org/keakon/doodle

    http://code.google.com/p/xian-min/

    http://code.google.com/p/google-app-engine-samples/

    http://code.google.com/p/rietveld/

    http://www.allbuttonspressed.com/projects/django-nonrel

    http://code.google.com/p/google-app-engine-oil/

    http://code.google.com/p/tipfy/

    http://code.google.com/p/kay-framework/

    https://github.com/xuming/micolog

    https://github.com/steffentchr/twitterengine

    https://github.com/initpy/selficious

    https://github.com/flosch/simpleapi

    https://github.com/garethr/appengine-bugs

    https://github.com/toomore/goristock

    https://github.com/livid/picky

    https://github.com/pelle/talk.org

    https://github.com/garethr/appengine-imified

    http://code.google.com/p/typhoonae/

    https://github.com/k7d/approcket

    http://ihere.appspot.com/

    https://github.com/mcroydon/html2text-appengine

    ======================
    http://apidoc.sinaapp.com/sae/SaeTOAuth.html

  • 高级软件工程师面试问题 Interview SeniorSoftwareEngineers

    hanselman这篇文章很有意思,尽管不是每个问题都很值得作为面试问题出现,但是很多都值得去仔细想想。

    一个优秀的面试问题,尤其是针对Senior Engineer的面试问题,不应该仅仅是问某个api的用法,某个很容易从帮助中找到的内容。有发散性,可以基于问题进行扩展的问题才是一个比较好的问题。

    下面是一个非常长的问题列表,主要是关于面向对象设计,设计模式,以及一些实际工程中会用到概念,都是比较基本的,但是也非常能考察一个高级工程师的水平,因为会牵涉到非常多方面。

    另外要说明的是下面很多概念性问题可以直接从wiki维基百科上找到答案。另外我会标记出个人觉得比较值得问的问题。

    原文在这里 http://www.hanselman.com/blog/NewInterviewQuestionsForSeniorSoftwareEngineers.aspx

    # What is something substantive that you’ve done to improve as a developer in your career?

    有没有做过什么比较实质性的事情来提升你的程序员职业水平?

    好问题。我的回答:这个很难说,我的做法是坚持学习,坚持写技术类博客。另外有些经验在这里提到过http://sunxiunan.com/?p=1799

    # Would you call yourself a craftsman (craftsperson) and what does that word mean to you?

    不敢叫自己大师啊,那得多牛逼?!

    # Implement a <basic data structure> using <some language> on <paper|whiteboard|notepad>.

    用某种语言在纸面上实现一个基本的数据结构。(用近似真实格式的伪代码来表达?)

    好问题。我的回答,找一本基础的数据结构书籍吧,比如这一本《数据结构与算法分析:C语言描述(原书第2版)》

    # What is SOLID?

    参考http://en.wikipedia.org/wiki/Solid_%28object-oriented_design%29

    这个solid不是说“结实的”,而是面向对象五大原则的简称:单一责任原则,开闭原则,莱西科夫替换原则,接口分离原则,依赖倒置原则。

    好问题。这几个原则的确应该背下来,太基础了。

    # Why is the Single Responsibility Principle important?

    为什么单一责任原则重要?

    好问题。我的回答,因为职责明确,设计就不容易混乱,即使有后续变化也是可控的。

    # What is Inversion of Control? How does that relate to dependency injection?

    参考http://en.wikipedia.org/wiki/Inversion_of_control

    实际中的例子,通知开会,一种可以打电话通知到每个人(这属于中心控制型的,必须有个controller/manager之类的);也可张贴一个告示,大家自己来看,这属于事件响应型的。

    # How does a 3 tier application differ from a 2 tier one?

    三层应用与两层应用的区别是什么?

    我只知道MVC三层应用。

    # Why are interfaces important?

    为什么接口重要?

    好问题。接口的重要在于消费者(客户端)不需要了解生产者(服务端)的细节,接口相当于合同,当合同不变的时候,谁生产如何生产都不是消费者关心的问题。

    # What is the Repository pattern? The Factory Pattern? Why are patterns important?

    关于设计模式的问题,

    第一个参考http://msdn.microsoft.com/en-us/library/ff649690.aspx

    工厂模式基本上是众人皆知的模式了。

    为何模式重要?我不觉得模式重要,模式的重要性在于让你能“喔!原来是这个”。但是对于一个没有几年编程经验的开发者而言,模式只能让你更混乱。

    设计模式很多情况下是通过加入一个抽象层来解决耦合之类的问题,但是层次越多越复杂,就好比单位中领导的级别越多越官僚一样。

    # What are some examples of anti-patterns?

    反模式?少用模式,多写点清晰的代码吧。

    # Who are the Gang of Four? Why should you care?

    四人组,名字叫不上来,但是他们是设计模式的总结者。

    # How do the MVP, MVC, and MVVM patterns relate? When are they appropriate?

    这也是微软特色,大家只要知道MVC就行了,其实大家现在用的都是MVC,但是由于水平高低,效果就是千差万别。

    啥MVP,MVVM我不知啊(也不是不知,只知道MVVM是wpf的一个概念,可我也不用wpf啊)

    # Explain the concept of Separation of Concerns and it’s pros and cons.

    参考http://en.wikipedia.org/wiki/Separation_of_concerns

    我也不是了解的很细。

    # Name three primary attributes of object-oriented design. Describe what they mean and why they’re important.

    封装/继承/多态?

    参考这里吧http://en.wikipedia.org/wiki/Object-oriented_programming

    学C++这几个概念是基础啊

    # Describe a pattern that is NOT the Factory Pattern? How is it used and when?

    不是工厂模式,我知道个单件模式。还有模板模式/facade模式/strategy模式,具体也要翻翻书,很少有意识的套用。

    # You have just been put in charge of a legacy code project with maintainability problems. What kind of things would you look to improve to get the project on a stable footing?

    第一步,先把代码用最大警告级别编译一遍,然后fix所有值得fix的warning。

    好问题。

    # Show me a portfolio of all the applications you worked on, and tell me how you contributed to design them.

    如果光是看文档,很难说到实质上。

    好问题。

    # What are some alternate ways to store data other than a relational database? Why would you do that, and what are the trade-offs?

    好问题,很多啦,内存/文件/云存储/nosql等等。tradeoff就看你的应用需求了。blabla。。。

    # Explain the concept of convention over configuration, and talk about an example of convention over configuration you have seen in the wild.

    好问题。

    我能想到的就是买车开车,很少有人买到车以后,拿着说明书调试这个那个,一般都是直接上路,因为汽车厂会给你一个比较不错的默认配置,也就是所谓的“方便”。

    这个方便也保证了你开其它车,基本上都差不多,不用重新配置或者学习什么。

    所谓方便”convention“就是把相对不错/比较普遍适用的配置都内置好了,用就是了。

    # Explain the differences between stateless and stateful systems, and impacts of state on parallelism.

    解释有状态与无状态系统,以及有状态系统在并行上的影响。

    好问题。这个说不好。有状态系统因为保持状态,并发运行时的访问/修改需要有锁同步机制。

    # Discuss the differences between Mocks and Stubs/Fakes and where you might use them (answers aren’t that important here, just the discussion that would ensue).

    跟TDD相关的问题。不会哦。

    # Discuss the concept of YAGNI and explain something you did recently that adhered to this practice.

    解释“YAGNI”。

    最简单的例子是当我们定义接口,会特意预留出一两个参数,说是为了将来使用,其实,没有将来。屁嘞!你根本不需要它!

    不是说不考虑可扩展性,但是要基于可预测的基础上。

    # Explain what is meant by a sandbox, why you would use one, and identify examples of sandboxes in the wild.

    比如把虚拟机比如vmware virtualbox作为沙箱,用起来可以隔离风险。大不了重启,或者删除之。

    # Concurrency

    * What’s the difference between Locking and Lockless (Optimistic and Pessimistic) concurrency models?

    * What kinds of problems can you hit with locking model? And a lockless model?

    * What trade offs do you have for resource contention?

    * How might a task-based model differ from a threaded model?

    * What’s the difference between asynchrony and concurrency?

    这些问题不错。并发相关的问题,设计多用户高性能系统必知。

    # Are you still writing code? Do you love it?

    我喜欢编程。

    # You’ve just been assigned to a project in a new technology how would you get started?

    如果是我,先了解这个技术的风险。小心求证,尽量缩小使用范围,否则是很致命的。

    # How does the addition of Service Orientation change systems? When is it appropriate to use?

    不懂。

    # What do you do to stay abreast of the latest technologies and tools?

    我跟的很紧哦!

    # What is the difference between "set" logic, and "procedural" logic. When would you use each one and why?

    不懂要问什么。

    # What Source Control systems have you worked with?

    ClearCase.很难用。最近不少问题都是跟CC相关的。

    # What is Continuous Integration? Have you used it and why is it important?

    持续集成。这个概念跟TDD也挂钩。

    # Describe a software development life cycle that you’ve managed.

    涉及的还是传统模型,不是scrum型的。

    # How do you react to people criticizing your code/documents?

    批评没问题,但是要有道理有根据。

    # Whose blogs or podcasts do you follow? Do you blog or podcast?

    这就很多了,看我以前写的文章吧。

    # Tell me about some of your hobby projects that you’ve written in your off time.

    主要是Lua和Py的,appengine上的比较多。

    # What is the last programming book you read?

    最近看得是《C++ FAQs》中文版。翻译的一般,内容也比较陈旧。更坚定了我使用C风格的C++的决心。

    # Describe, in as much detail as you think is relevant, as deeply as you can, what happens when I type "cnn.com" into a browser and press "Go".

    尽可能详细深入的描述,当你在浏览器敲网址然后go后面的技术细节。

    好问题。很发散,绝对能看出面试者的技术厚度。

    # Describe the structure and contents of a design document, or a set of design documents, for a multi-tiered web application.

    # What’s so great about <cool web technology of the day>?

    # How can you stop your DBA from making off with a list of your users’ passwords?

    # What do you do when you get stuck with a problem you can’t solve?

    参考这里计算机编程新人入行指导 

    http://sunxiunan.com/?p=961

    # If your database was under a lot of strain, what are the first few things you might consider to speed it up?

    先profiling哦!

    # What is SQL injection?

    # What’s the difference between unit test and integration test?

    单元测试应该是程序员做。集成测试就牵扯到tester了。

    # Tell me about 3 times you failed.

    # What is Refactoring ? Have you used it and it is important? Name three common refactorings.

    我一直在重构自己的代码。重构原则参考这里

    C++项目代码规范(偶自用)http://sunxiunan.com/?p=1787

    # You have two computers, and you want to get data from one to the other. How could you do it?

    命名管道,socket,共享文件夹,路子还是很多的。

    # Left to your own devices, what would you create?

    # Given Time, Cost, Client satisfaction and Best Practices, how will you prioritize them for a project you are working on? Explain why.

    这个很值得问。

    # What’s the difference between a web server, web farm and web garden? How would your web application need to change for each?

    # What value do daily builds, automated testing, and peer reviews add to a project? What disadvantages are there?

    都是为了提升代码质量,但是会延长工期。

    # What elements of OO design are most prone to abuse? How would you mitigate that?

    # When do you know your code is ready for production?

    看bug fix的统计曲线。

  • 理解Node.js事件驱动编程

    Node.js现在非常活跃,相关生态社区已经超过Lua(基本上比较知名的功能都有nodejs模块实现)。

    但是我们为何要使用Node.Js?相比传统的webserver服务模式,nodejs有什么优点优势?

    Node.Js是基于javascript语言,建构在google V8 engine以及Linux上的一个非阻塞事件驱动IO框架。nodejs是单进程单线程,但是基于V8的强大驱动力,以及事件驱动模型,nodejs的性能非常高,而且想达到多核或者多进程也不是很难(现在已经有大量的第三方module来实现这个功能)。

    这里主要不是介绍nodejs具体应用代码,而是想介绍一下事件驱动编程。

    在这篇文章(1)里面,Dan York介绍了两种典型的事件驱动实例。

    第一个例子是关于医生看病。

    在美国去看医生,需要填写大量表格,比如保险、个人信息之类,传统的基于线程的系统(thread-based system),接待员叫到你,你需要在前台填写完成这些表格,你站着填单,而接待员坐着看你填单。你让接待员没办法接待下一个客户,除非完成你的业务

    想让这个系统能运行的快一些,只有多加几个接待员,人力成本需要增加不少。

    基于事件的系统(event-based system)中,当你到窗口发现需要填写一些额外的表格而不仅仅是挂个号,接待员把表格和笔给你,告诉你可以找个座位填写,填完了以后再回去找他。你回去坐着填表,而接待员开始接待下一个客户。你没有阻塞接待员的服务

    你填完表格,返回队伍中,等接待员接待完现在的客户,你把表格递给他。如果有什么问题或者需要填写额外的表格,他给你一份新的,然后重复这个过程。

    这个系统已经非常高效了,几乎大部分医生都是这么做的。如果等待的人太多,可以加入额外的接待员进行服务,但是肯定要比基于线程模式的少得多。

    第二个例子是快餐店点餐。

    在基于线程的方式中(thread-based way)你到了柜台前,把你的点餐单给收银员或者给收银员直接点餐,然后等在那直到你要的食物准备好给你。收银员不能接待下一个人,除非你拿到食物离开。想接待更多的客户,容易!加更多的收银员!

    当然,我们知道快餐店其实不是这样工作的。他们其实就是基于事件驱动方式,这样收银员更高效。只要你把点餐单给收银员,某个人已经开始准备你的食物,而同时收银员在进行收款,当你付完钱,你就站在一边而收银员已经开始接待下一个客户。在一些餐馆,甚至会给你一个号码,如果你的食物准备好了,就呼叫你的号码让你去柜台取。关键的一点是,你没有阻塞下一个客户的订餐请求。你订餐的食物做好的事件会导致某个人做某个动作(某个服务员喊你的订单号码,你听到你的号码被喊到去取食物),在编程领域,我们称这个为回调(callback function)。

     

    Node.Js做了什么工作呢?

    传统的web server多为基于线程模型。你启动Apache或者什么server,它开始等待接受连接。当收到一个连接,server保持连接连通直到页面或者什么事务请求完成。如果他需要花几微妙时间去读取磁盘或者访问数据库,web server就阻塞了IO操作(这也被称之为阻塞式IO).想提高这样的web server的性能就只有启动更多的server实例。

    相反的,Node.Js使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    考虑下面这个过程:

    1,你用浏览器访问nodejs服务器上的"/about.html"

    2,nodejs服务器接收到你的请求,调用一个函数从磁盘上读取这个文件。

    3,这段时间,nodejs webserver在服务后续的web请求。

    4,当文件读取完毕,有一个回调函数被插入到nodejs的服务队列中。

    5,nodejs webserver运行这个函数,实际上就是渲染(render)了about.html页面返回给你的浏览器。

    好像就节省了几微秒时间,但是这很重要!特别是对于需要相应大量用户的web server。

    这也就是为什么Node.Js这么热这么惹人关注。而且它还使用了一个非常通用的编程语言Javascript,也让开发者可以快速容易的编写高可扩展性服务器。

    (1) http://code.danyork.com/2011/01/25/node-js-doctors-offices-and-fast-food-restaurants-understanding-event-driven-programming/

  • 程序员自我学习自我培训指南

    你是一个程序员初哥,刚从大学迈进公司却没有人指导,要么公司给你指定了导师,却不好意思大事小情都问他。你想提高自己的编程水平,却不知该如何下手。如果你想提升自己,成为一个合格的天天向上的程序员,这篇文章就是为你准备的。

    学什么?

    有些人对什么都感兴趣,硬盘上存着几百G的教学视频电子书破解软件,却只是仅仅保存着,没有转化成知识。有些人只知道自己刚进公司的那点东西,JDK一定要1.4.2,VC++一定要6.0,系统一定要WindowsXP,否则就是大逆不道。前一种是不知道自己想要什么,后一种是固步自封眼界短浅,都不是一个程序员应该有的学习态度。

    常见的程序员有Windows桌面开发,Linux服务器开发,Web前端开发,DB数据库相关,游戏服务器端开发,游戏客户端开发,RIA开发(如flash、silverlight),移动开发(这个现在最火了尤其是Android和iOS),嵌入式开发,行业软件开发等等,基本上我列举的这些已经涵盖了大部分程序员类型,每个类型都有不同的基础知识以及扩展内容需要学习。另外有一些共通的内容如数据结构、基本算法、操作系统是都应该学习了解的。

    另外一种分法是按照编程语言区分,但是这个比较有局限性,比如C程序员,一般是Linux服务器开发或者嵌入式,单纯懂C语言是没前途的。再比如PHP,就要对Web前端开发和服务器都有所涉及才能称得上称职。

    在这里还要多废话一句,程序员相比其他行业是一个需要不停学习的行当,固步自封立刻就落后,经验值的累积速度会随着年龄的增长而降低,这也是为什么在国内很少看到50岁以上的程序员。至于架构师这个很多程序员期望的职业,我的看法是:如果架构师不写代码只会用PPT,只不过是一个大忽悠罢了。

    我这篇文章只是介绍了一个方法,希望能帮助刚入门的朋友答疑解惑。根据这篇文章http://www.geekonomics10000.com/519 如果你想得到一个比较不错的职业发展,长期不间断的练习是绝对必须的。

    如果你的情商高于智商,非常擅长与人交往,那么程序员不是合适你的职业,做其它任何行业都会得到比程序员更好的结果。这也许有些偏激,但对于国内现状就是这样。十年以后,如果你还是在做编程,比较一下你的同学朋友就会知道我说的正不正确。

     

    如何学?

    我下面介绍的学习都是关于技术,但是首先要说明的是,一个优秀的程序员必定要对英语有一定的掌握,应该有比较强的读写能力,另外最好有一定的听说能力。

    英语的学习如同技术学习一样,必须持之以恒。比如每天都听一篇cnn student news,泛听一下nightly news等等。在apple itunes上可以免费订阅大量podcast,只要你坚持听时时学,英语水平一定会提高。而且英文水平的提高会对你的职业带来非常大的帮助。

     

    专精篇

    无论什么行业,如果想成为专家,专精某个或者某几个方面是必要的,比如我就一直标榜:Windows Visual C++程序员。这里面就包含了Windows开发,Visual C++集成开发环境使用,C++程序员几个方面。由于行业不同专业不同,这里就不说明对于你的行业需要专精什么,如果你有疑惑,欢迎留言或者在 http://t.sina.com.cn/sagasw 给我留言。

    我们用学习英语的办法来说明如何专精“听读写说”,就以一名C#程序员来举例好了。

    1)听看

    第一步是听视频或者看视频。这是对某个方面知识快速了解的好办法,因为视频相比书籍文档更精彩一些,而且花费的时间相对比较少,注意力更集中一些。

    www.verycd.com上可以看到大量的编程类培训视频,只要你想学的不是非常偏门都可以找到。也可以在优酷上在线观看。如果你对自己的英文水平有自信,可以到youtube.com上观看英文的视频。另外C#是微软公司出品,微软公司最大的特点就是不差钱,他们的免费视频在网上都可以找到。

    在verycd上搜索一下http://www.verycd.com/search/folders?kw=C%23 就可以找到好几页,比如这个http://www.verycd.com/topics/2857178/ 《传智播客.Net培训视频教程》,还有http://www.verycd.com/topics/2866044/ 《C#4.0中文视频教程》都可以下载听听。

    在微软WebCast http://msdn.microsoft.com/zh-cn/dd796167 可以看到大量编程方面的培训视频。关于C#有三个“C#面向对象设计模式纵横谈系列课程”“C#2.0 锐利体验系列”“Modern C#系列课程”,可以下载视频和培训的ppt,看完这几个系列视频,对C#就应该有一个基本程度的了解。

    如果想学习Java编程语言,搜一下http://www.google.com/search?q=java%E5%9F%B9%E8%AE%AD%E8%A7%86%E9%A2%91 也可以找到大量视频资源。

    我建议是把视频下载,放到手机或者ipod上就可以随时随地的听听看看,方便得很。

    2)读

    读是专精某个领域知识中最重要的一步,读书、读文档、读代码都算是这部分。

    先说说读书。读书首先是选对书,选书也难也不难。如果你身边有高人,可以请教高人。如果感觉没有高人,那么可以参考china-pub的排行榜,然后结合douban.com上的网友点评来选购,如果还没头绪,给我留言好了。计算机方面的书籍我建议选下面几个出版社的:人民邮电(知名品牌是图灵)、电子工业、机械工业、清华大学出版社、东南大学出版社。不能说他们出版的一定是精品,但是精品基本上都被这几个出版社出了。比如C#方面,如果我选择我会选这一本作为精读http://www.china-pub.com/192099 《C#与.NET3.5高级程序设计》

    精读的书目不要多,一次应该限定在两三本左右。读书时应该备有以下工具:一个本子,一支荧光笔,一支签字笔。本子用于记录自己的心得体会,感觉比较精彩的内容可以标记出来。另外应该定期把笔记总结到网上(比如google docs中)。为什么不直接总结成电子文档呢?个人经验觉得本子是最快捷也最不影响阅读的记录方式。如果你觉得转成电子文档麻烦,那我还有一绝招,就是直接用数码相机用微距模式拍照,然后保存图片就好了。

    如果涉及到代码,也应该把示例代码的运行环境准备好,比如C#就需要安装一下DotNet开发环境(比如Mono或者VisualStudio),学Java就应该安装JDK,学C语言应该安装一个gcc等等。

    精读时应该尽量理解每个章节,章节后面如果有习题就应该把习题做完,然后再学后续内容。如果有相关示例代码,也最好把代码自己录入然后调试运行一下。前面之所以提到选对书,就是因为如果你书选的有问题,那么精度这一步就很难进行下去,翻译的质量直接影响到你学习质量。精读时的进度也不要太快,免得自己理解不深。如果有可能,最好中英文比对一下(现在网络上可以搜到很多书的英文版ebook),这样不仅可以学习英文,而且最重要的是一些中文中比较难理解的,阅读英文部分可能会容易看懂,这个好像有些难理解,但是就我个人翻译的经验,一般来说翻译会把译者的想法带入,所以很可能造成一些歧义。

    精读部分还包括读文档,因为很多比较新一些的知识还没有书籍,只有论文或者电子文档,还是建议把文档打印出来阅读。

    读代码也是很重要的一点,如果不是天才,那阅读经典代码就跟阅读经典名著一样,对于编程语言的学习是非常必要的。选择一个好的阅读项目跟选书一样要精心,我建议先从比较精短的示例开始阅读,比如微软的C# code example http://msdn.microsoft.com/en-us/vcsharp/aa336738 或者像是www.codeproject.com上得分比较高的文章代码。阅读的代码一定要选择可实际运行的,这样可以在你感兴趣或者有问题的地方加上断点调试,观察变量、调用栈等等变化。

    当掌握比较基本的知识以后,应该转向选择一些比较经典的开源项目。C#或者Java好的开源项目很多,这里就不多说了。

    3)写

    这里的写不是指前一步中写写书上的示例代码,而是说把前面两步学到的知识应用到实际项目中,这一步是最重要的。

    再加强说明一次,把学到的东西应用在自己的实际项目当中,不管项目大小,这一步是自学过程中最重要的。

    跑题一下说说,我看到过很多培训,内容很好,讲的也不错,但是最后收效甚微。问题不是讲师的水平不够,而是听众只是听了,没有用起来。光看是看不成高手的。

    有些朋友会问了,我真不知道写什么,能给点建议么?我的建议是先从小应用开始,然后在写一个比较实用的程序。

    什么是小应用呢?比如我喜欢看网络小说,就可以编一个浏览器一样的程序,打开以后它就直接访问小说网站。或者喜欢炒股的,可以编一个股票信息收集,把网上的股票信息抓取下来。或者有一些自己需要的功能,比如定期抓取屏幕存成图片文件(这个对于测试人员比较有用),或者就是编一个程序它可以播放视频音频。小应用的意思是自己觉得好玩,功能上也不是很复杂,比较容易实现的。

    写过一些小程序以后,有感觉了,那就应该把学到的东西用到自己实际项目当中,比如我学Lua,就用Lua加Sqlite数据库编写了以前需要手动实现的功能,也用Lua实现了对c++代码的解析生成html帮助文档。也许你工作项目未必需要这个知识,但是可以在一些边缘项目中使用,力争多用多写,熟能生巧,编程其实就是手熟罢了。

    如果就是不知道该如何写一个小程序,那么有几种可能,一个是你想的功能太复杂,这个好解决,另找一个题目就是了;另一种可能是你精读的不够,我建议你把书再仔细读一遍,把书上的例子好好再次写写;如果题目也不复杂,精读也读了,还是不知如何下手,那劝你还是换一个行当好了。三百六十行行行出状元,不是一定要做程序员这一行的。

    4)说

    说,就是分享。分享的过程其实也是提高的过程。

    一般来说,IT公司都有一个分享学习机制,程序员对自己专长的方向研究一段时间以后,整理成ppt,然后演示给大家看。也有一些兴趣组比如Python本地用户组也有类似线下分享交流的机会。如果有这样的机会,建议大家踊跃作为讲师参加。当你写讲稿或者演示的时候会突然发现某些方面其实还很薄弱,当听众提问交流的时候也会发现自己某些地方可能了解的不是那么透彻,这其实也是在学习。分享不仅仅锻炼口才,而且会给人你在这个领域比较精深的感觉,而且从分享过程中你会发现很多以前没注意到的问题。

    分享也是推广的过程,比如你看好C#语言,但是公司可能觉得没有这方面人力或者了解不够,你的传道会让大家对这方面知识了解的多一些,相关疑问也可以找你来答疑,这样也是提升人气值的好办法。

     

    广博篇

    一个优秀的程序员,不仅仅要有几样拿手的专业领域,还应该博彩众家之长,了解一下软件工程、架构设计等等方面的知识,还要及时跟踪了解国内外技术动态。

    首先,应该像英语学习中的泛读一样,通读一些感兴趣的经典的书籍,比如《程序员修炼之道》《设计模式》《代码大全》《深入理解计算机系统》《快速软件开发》《Unix编程艺术》《编程珠玑》等等。这些书不像精读书可以立刻用到实际。但是这些经典书籍中的思想是可以一直影响整个编程生涯。其实这些书才是真正值得精读的。只不过没办法立刻见效,所以把它们作为广博篇中的提高级书目。

    选书一定要小心,烂书就跟老鼠屎,会恶心你很长时间并且降低你学习的积极性。如何选一本好书参考前面精读部分。

    想了解技术动态,订阅技术牛人的blog是非常重要的,比如我对redis很感兴趣,于是就订阅了redis作者antirez的博客,他有时候会对一些项目中比较重要的设计做解读。另外比如infoq.com,可以订阅他们的rss来跟踪最新的文章。我建议大家申请一个google账户,使用google reader作为rss阅读器。在google reader中订阅很方便,直接加入博客地址就可以了。

    想跟踪最新潮最酷炫最流行最时尚的编程技术,下面几个来源不可错过。

    一个来源是reddit的programming讨论区 http://www.reddit.com/r/programming/ reddit的编程讨论区非常活跃,基本上流行的博客文章内容都会被人提交到讨论区,而且讨论的质量也很高。另外一个来源是DZone的首页http://feeds.dzone.com/dzone/frontpage DZone新闻有一个很有意思的特点是可以看到顶和踩的数量,一般顶数量比较高的,可以阅读。再有一个是美味书签的programming http://www.delicious.com/tag/programming 和development http://www.delicious.com/tag/development 这两个tag基本上涵盖了编程相关的链接(未必是新文章),可以作为参考。最后一个新闻来源是HackerNews,也就是HN http://news.ycombinator.com/ ,HN与reddit programming有些类似,可以作为一个补充。

    这几个来源更新非常快,基本上每天都可以看到上百条更新。我建议是不用每条都看,标题感兴趣的看一看,或者发现同时在几个源都出现的也可以看看。每天有个二三十分钟看完前面几个新闻来源,对于新技术动态或者各种技术八卦那就是了如指掌了。

    如果你发现某个博客文章写得质量非常高,建议你可以订阅这个博客,一般来讲这样的博客质量都是水准以上的。我大部分的技术博客都是这么搜集来的。

    另外现在博客上基本都有twitter地址,也可以follow这些技术牛人的twitter,由于推特的局限,相比博客的学习价值要更低一些,但是交流的时效性比较高。

    邮件列表讨论也是一种很不错的讨论方式(相比论坛而言),比如python-cn,toplanguage都是很好的中文技术类邮件讨论组。

     

    关于广博篇,本来还想展开一些,写写如何解决问题,但是这些内容在以前的博客中都有涉及。

    建议大家阅读以下内容:

    Windows桌面开发者的必备软件 http://sunxiunan.com/?p=1543

    关于编程的一些想法 http://sunxiunan.com/?p=1073

    计算机编程新人入行指导 http://sunxiunan.com/?p=961

    计算机编程新人入行指导番外篇 http://sunxiunan.com/?p=969

    技术笔记一月二十二日 http://sunxiunan.com/?p=928 (2009年年初这篇博客最后我写到:c、python、web开发、iphone开发,是我在2009年比较感兴趣的技术,另外,有空学学外语也很必要,感觉自己这两年有些吃老本,是该充充电了。两年以后我看好的Python和iPhone现在都是火到不行,但我都没有真正学好投入进去,典型的眼高手低)