如何成为一个程序员:一个简短、综合的个人总结

来源:互联网 发布:古人能吃饱饭吗 知乎 编辑:程序博客网 时间:2024/05/01 11:20

翻译自:http://samizdat.mines.edu/howto/HowToBeAProgrammer.html (转载请注明原作者)

Author: Robert L Read

简介 :


   成为一个优秀的程序员是困难的,同时又是可贵的真正将软件项目付诸实践最困难的部分在于如何处理与同事和客户之间的关系。诚然,编写程序非常重要,需要较高的智商和技能。但是,与为了使软件系统对于客户和许多的协作者而言成功一个好的程序员必须做的其他事情比起来,前者只是小儿科。在这篇文章,我将尽量简洁的总结这些事情,这些我希望在21岁的时候别人就已经告诉我的事情。
    这篇文章非常主观,因此注定了是一种个人观点,甚至还有点自以为是。我将讨论的范围限定在一个程序员在工作中可能面临的问题。许多问题和解决方法都非常得普遍,在这一点上我可能显得有些唠叨。除了这一点以外,我希望这篇文章能够对你有所帮助。
    计算机编程可以在书(课程)中学习。这些出色的书籍:The Pragmatic Programmer 【Prag99】(程序员修炼之道) ,Code Complete【CodeC93】(代码大全) ,Rapid Development 【RDev96】Extreme Programming Explained 【XP99】 都讲授计算机编程甚至一些更大的话题如:如何成为一个好的程序员。读此文之前,首先应该阅读Paul Graham [PGSite]和 Eric Raymond [Hacker的文章(或者和这篇文章一起读)。这篇文章全面总结了我所看到的成为一个好的程序员所要具有的所有技能。

开始:

    个人技能

        学会调试

        如何通过划分问题空间来调试?
        如何移出一个错误?
        如何使用日志来调试?
        如何理解性能问题?
        如何修复性能问题?
        如何优化循环?
        如何处理I/O开销?
        如何管理内存?
        如何处理时隐时现的Bug?
        如何学习设计技巧?
        如何进行试验?

     团队技能

        为什么评估很重要?
        如何评估编程时间?
        如何查找信息?
        如何利用别人作为信息源?
        如何聪明地写文档?
        如何与糟糕的代码协作?
        如何进行源码控制?
        如何进行单元测试?
        有难题时休息一下?
        如何判读何时回家?
        如何与难处的人协作?
        

    个人技能

        学会调试
    调试是成为一个程序员的基石,动词"debug"的第一层意思是除去错误,而真正重要的意义在于通过监测程序来查看程序内部执行的过程。一个不能有效地进行调试的程序员就像一个瞎子。
    思考 设计,分析,复杂性理论,或其他的理想主义者更为基础,与一般工作中的程序员不同,后者不会生活在理想世界里。即使你本身非常完美,你也必须与大部分软件公司或组织(例如 GNU)或者是你的同事们写的代码打交道。大部分代码并不完美,也没有完美的文档。如果你不能看到这些代码执行的过程,那么可能很小的困难都会困扰你很久。通常要使代码执行的过程可见,只有一种办法,那就是,调试。
    调试关注的是运行着的程序,而不是程序本身。如果你从软件公司买了软件,你通常不会去看那些程序。但是经常会有很多地方的代码与文档并不相符(使你的机器宕机是一个相当普遍又备受瞩目的例子),或者文档上压根就没有说明。更为普遍的是,你的程序出现了一个错误,你仔细检查了代码可是对于错误为什么会发生依然毫无头绪。显然,这说明你所作的一些假定并不正确,或者一些你预期不到的情况发生了。有些时候魔术般的盯着源代码分析会解决问题,如果不行,只能调试。
    为了使代码执行的过程可见,你必须在执行代码的时候监测一些东西。有些是可以看到的,例如屏幕上显示的东西、两个事件之间的间隔。而许多其他的东西并不可见,如代码中一些变量的状态,代码的哪一行被执行了,一个特定的断言是否针对一个复杂的数据结构。这些隐藏的东西需要被揭示出来。
    通常查看一个正在执行程序的内部的方法有以下几种:
    1.使用调试工具。
    2.行打印 ----- 对程序做临时的改动,添加一些打印语句将信息打印出来。
    3.日志    ----- 以日志的形式对程序的执行开一个永久的窗口。
    如果调试工具稳定可用的话,当然是非常好的;但是行打印和日志更为重要。调试工具的开发常常滞后于语言的开发,有些时候不能及时可用。另外,由于调试工具可能微妙地改变程序的执行,所以它可能并不总是实用。最后,有几种调试,例如通过一个断言来检查一个数据结构,需要修改代码而且会改变程序的执行。当有一个稳定的调试工具时,学会使用它是非常有帮助的;但是,学会使用另外两种方法则是必不可少的。
    当需要修改代码时,一些初学者害怕调试。这很容易理解----有点像检查性的手术。但是你必须学会探测代码,使它跳转,必须学会在它上面进行试验,需要知道:这些临时性的修改对它一点坏处都没有。如果你确实觉得害怕,找一个导师----由于害怕开始学习调试,我们丧失了很多优秀的程序员。

       如何通过划分问题空间来调试?
    调试非常有趣,因为它从一个谜团开始。你然为它应该这样做,而实际上它却没有这么做。调试并不总是非常简单----调试需要创造性和智慧,对于调试来说,如果只有一个法宝的话,那就是"分而治之"。
    假如,你创建了一个程序需要顺序完成10件事。当你运行程序时,程序崩溃了。由于你的代码中让程序崩溃的语句,现在一个谜团产生了。当你看到输出时,发现前面7件事已经顺利执行完毕了。最后三件事在输出中没有显示,所以,你的谜团空间变小了----’在执行#8,#9,#10件事的时候发生了崩溃。
    能否设计一个实验看看在哪里发生了崩溃?当然,你可以使用调试器,或者在#8和#9之后添加行打印语句。当它再一次运行的时候,我们的谜题空间更小了,可能是在#9上崩溃了。我发现,无论在任何时刻切忌谜团是什么可以是一个人更专注于问题本身。当几个人同时在压力下解决一个问题时,常常会忽略最重要的谜团是什么。
    
    

原创粉丝点击