我现在的生活很糟糕,简单来说:很混乱。
我不想一天一天的就这么过下去,我知道自己可以过得很充实,get more from life or make the best of what happend.
我想用五年的时间来学完computer science的本硕基本课程,学习时间安排在晚上:
一小时理论学习,一小时开放源码,一小时相关项目(如做CPU,编译器,小型操作系统)
对于周末,有空的时候可以多花些时间在上面,持之以恒
每天问自己:我到底想干啥?我怎样才能够热爱上编程,不怕困难?怎样从舒适区不断走出来?我得怎样做?不断地去提升自己!去享受进步和战胜自己的乐趣。怎样让知易行难变成知易行易!因为总是想的很美好,做起来却很难。那么多想想应该怎么做。
1.只有真正喜欢才能写好程序
那么怎样才能真正喜欢,我自己认为可以从两方面入手:(1)培养成就感,一点一点地获得小的成功;(2)心理学上好像有个定律,就是假装自己很喜欢,然后按照自己很喜欢的形式做事,久而久之,这种形式上的假装会变成真正的喜欢。
2.把程序当艺术品,像写诗一样来写代码
雷军这里给了几个很实用的建议:
(1)买几本经典的编程书,把书上的例程全部重写一遍,对比缩小差距,一步一步改变自己的编程风格和技巧。
(2)基础扎实后,看Linux等系统级的源代码
(3)通读MSDN的所有资料
(4)牢记出错的地方一定会出错,追求bugfree code。
每个变量都做初始化;
引用每个参数都会做有效性检查;
在可能出错的地方都会做边界条件检查。
3.必须写够十万行代码,不要心存侥幸
4.时刻保持好奇心
不断学习新的东西,你要理解为什么iPhone出来后为什么很多高手用iPhone。经常看业内各种技术杂志,参加各种聚会,交几个博学的技术高手。
5.不要局限在技术本身,多花点精力关注用户
1.从小事做起,学会吃亏,与他人合作
不斤斤计较与一时一地的是非得失。
2.心有多大,舞台就有多大。我们很多的成功,来自于敢想敢做。
以前从来没有想到过会接触到编译原理,自己做解释器,但是由于项目所需,自己静下心来做,发现自己竟然也可以。这是本科时候根本无法想象的。
3.好好学习天天向上
谭博天天早上起来,上班前先看一小时书,多年积累下来,现在在系统、数据库、开发等多个领域已成为无人敢挑战的超级专家了。
4.勇于实践,勇于犯错,勇于反思
关键就是要有行动。
5.要有方法、有套路,对问题有系统思考,对解决方案有战略性设计
很典型的就是:软件工程等,自然而然扩展到其它各种问题的解决套路,包括对未知问题的解决方案
6.独立思考,不人云亦云
雪崩发生时,一般受害者都是一批一批的,很少有单个人的受害者,原因很简单,单个人在雪崩发生地会相当小心和警觉。但一个群体,群体越大,每个人就有一种虚幻的安全感和人云亦云的判断。
7.少抱怨,少空谈,积极主动,多干实事
世界上永远有不完美的事情,永远有麻烦,唯一的解决之道就是面对它,解决它,做实实在在地事情,改变我们不满的现状,改变我们不满的自己。
8.对职业负责,对目标负责,对自己负责 成功者往往自觉自律,信守承诺,心无旁骛
不要片面追求考核成绩,片面追求权钱利益、片面追求各种指标;片面地对上负责,对他人负责,而不对自己负责,不对自己目标负责,失去工作的使命感、责任心、热情和好奇心,必将不能达到自己的最佳境界。
9.多点人文修养和审美情趣
10.大家好,才是真的好,关注人,帮助人,真诚待人,厚道做人
对事不对人,与人为善。 这一点自己做的比较糟糕,自己以后一定要改进!
11.开放和分享的态度
12.做好时间管理
1.简介
· Linus Torvalds - Linux kernel 作者。
· Dave Thomas – “Pragmatic Programmer”(注:douban)和 “Programming Ruby”(注:douban)以及其它一些优秀书籍的作者。你可以在 这里 读读他对编程的一些想法。
· David Heinemeier Hansson – Rails Framework 作者-一个目前最新最热的Web开发框架。他的blog在 这里.(陈皓注:他也是37signals的领导人之一)
· SteveYegge –他可能并不那么知名,但是他给了很多有意思的回答。他有一个很火的关于编程的 blog,他也是游戏 “Wyvern”的作者。(陈皓注:他最火的是去年在google+上对google和amazon的吐槽,06年他应该在google了)
· Peter Norvig – Research Director at Google, 知名的 Lisper,AI书的著名作家,个人主页。
· Guido Van Rossum – Python 发明者。
· Bjarne Stroustrup – C++发明者, 个人主页。
· James Gosling – Java 发明者。
· Tim Bray – XML和 Atom规格说明书作者之一 个人博客 。
2.喜欢的软件或工具
操作系统:Unix
脚本语言:Ruby Python
编程语言:Lisp
文本编辑器:Emacs
版本管理:SVN,Perforce更好一些,但是也很贵 git
Shell脚本:Bash
数据库:当然是MySQL
浏览器:Firefox
IDE:NetBeans
所有的这些工具(Unix, Emacs, Firefox, GIMP, MySQL, Bash, SVN, Perforce) 都有一个共同点:他们是可扩展的。例如:他们都有可编程的API。伟大的程序员知道怎么编写他们的工具,而不只是去使用。
3.最喜欢的编程书
The C Programming Language
Patterson & Hennessy 的计算机结构的书
Crawford & Gelsinger 的 “Programming the 80386
Andrew Tanenbaum 的 “OperatingSystems: Design and Implementation”.
Extreme Programming Explained
Patterns of Enterprise Application Architecture
Structure and Interpretation of Computer Programs
IBM/360 Principles of Operation.
Neil Stephenson的 Quicksilver.
Programming Pearls 作者Jon Bentley
(一)启蒙入门
1.学习一门脚本语言,如Python或Ruby
2.用熟一种程序员的编辑器和一些基本工具(vim/Emacs/sources insight/ctag)
3.熟悉Unix/Linux shell和常见的命令行
4.学习Web基础(HTML/CSS/JS)+服务器端技术(LAMP)
(二)进阶加深
1.C语言和操作系统调用
《算法导论》和《编程珠玑》 (麻省理工免费课程)计算机科学和编程导论 (麻省理工免费课程)C语言内存管理 《Unix高级环境编程》 《用gdb调试程序》《跟我一起写makefile》 Windows 程序设计 ,MFC程序设计
2.学习JAVA
《Java核心技术编程》和《Java编程思想》
3.Web的安全域架构
4.学习关系型数据库
5.一些工具 Git/SVN Junit
《编程修养》 《代码大全》《重构》《代码整洁之道》
(三)高级深入
1.C++/JAVA和面向对象
(麻省理工免费课程)C++面向对象编程
“如何学好C++”中所推荐的那些书至少两遍以上(如果你对C++的理解能够深入到像我所写的《C++虚函数表解析》或是《C++对象内存存局(上)(下)》,或是《C/C++返回内部静态成员的陷阱》那就非常不错了)
《设计模式》必需一读,两遍以上
《深入浅出MFC》《STL string类的写时拷贝技术》
《Effective Java》 and《Java解惑》
2.加强系统的了解
《Unix编程艺术》 《Unix网络编程卷1,套接字》 《TCP/IP详解卷1:协议》 《Unix网络编程卷2,进程间通信》
《Windows核心编程》
3.系统架构
负载均衡 多层分布式系统 CDN系统 P2P式系统 虚拟化技术 Thrift Hadoop NoSQL数据库
Peter Norving说:阅读卓越代码就如阅读优秀书籍一样重要。
1.尽力构建并运行代码
2.不要只注重细节:找到代码结构和风格
3.确信自己理解所有结构
4.做些随机深入研究
5.在困惑的地方做测试
6.提取奇特的代码,使其成为单独的程序
7.代码不干净就重构部分代码,好的测试有助于重构
8.记住一个事实,如果你新接触一个重要的代码库,你不可能立即理解它。这需要数天、数周和数月的潜心努力,接受这个事实。耐心并有条不紊地阅读和编写代码,你最终能熟悉项目的方方面面,成为大牛
9.态度通常是最重要的:如果你视阅读代码为日常繁琐工作,那么你会逃避它;若你视其为一个机遇,那好事终将到来。
无论文档怎么说,源代码才是最终的真相,才是你能找到的最好的、最新的并且最权威的文档,这永远是事实。你越早承认这一点,你就能够成为一个越来越富裕的软件开发者。Brandon Bloom在Hacker News 上投递的一篇杰出的文章。“一两年后,两个开发者找到我,感谢我曾强迫他们在自己的代码海洋中沉浮,他们的技术越发精湛,并且好奇当初在没有源代码的情况下是如何做完每件事的。”
Rob Pike (Ken Thompson) 当程序出错时,本能地一头扎进问题,检查报错跟踪信息,添加调试打印语句,启动调试器等。但Ken只是站在那思考,且总是比我先找到错误。
Ken已经在脑子里构建了代码模型。所以纠错前先思考。如果你一头扎进问题,你可能只解决了当前出现问题的代码,但如果你先思考这个错误,这个bug是怎么引入的,你通常发现和纠正一个更高层次的·问题,进而改进系统设计。思考-不看代码的思考是最好的调试途经。
1.坚持你的远见,灵活把握细节
2.只和最好的人合作
互设榜样,互相挑战,互相学习
3.树立高的期望值并加以衡量
在真实极限中找到一个可持续的驱动来激励自己不断超越自我,不要害怕失败
1.永远不要停止阅读与学习
阅读书籍,而不只是网站
阅读只为自我提升,而不只是为了下一个项目
阅读提升你的基础,而不只是新技术
2.跟比你聪明的人工作
3.变成一个全才
4.阅读并记录别人的代码
5.在实际项目中获取编程经验
只有在真实的项目中,各种压力下、真实善变的客户、不断变化的需求下,才能不断提升自己的技能。
6.教授别人编程技巧
可以强迫自己去理解不同水平的人的情况
7.每年学习一种新的编程语言
用一年的时间学习一种新的语言,已经足够让你对它的基础了解透彻,同时你可以理解不同语言之间的风格。
8.每年完成一个有意思的项目
不一定有什么用途,但一定要有意思,让你非常有兴趣把它做的很棒。
9.学习汇编语言
可以让你了解计算机室如何工作的
10.与你的应用客户交流获取信息
11.锻炼身体
12.练习快速打字
1.经常提高你所在解决问题的难度和范围。大多数人并没有20年的经验,他们只有1年的经验,只不过反反复复使用了20年。别做这种人。
2.关注这些东西:文档、方法名或函数名、(变量名)、广泛编写测试。你的代码应该看起来专业。
1. 热爱编程
编程是一种为了满足兴趣而心甘情愿去做的劳动(Programming is a labor of love)。和其他任何职业一样,唯有真正的热情,才能完成真正的伟大事情。最优秀的软件工程师是工匠,他们能把能量、独创性和创造力融入到每一行代码中。伟大的工程师知道何时该把代码雕琢至完美,知道何时把大型系统像拼图一样组装到一块。热爱编程的工程师从构建软件中获得满足,就好比一位作曲家在完成一部交响乐后而欣喜若狂。正是兴奋感和成就感,才造就了喜爱编程的明星工程师。
2. 完成事情
聪明人都知道,解决问题的最佳途径是直面问题,而不是花上数周来设计复杂又不必要的架构和函数库。优秀工程师应当会问:解决手头问题的最简单方法是什么?最近的软件开发方法——敏捷实践,正是专注那个。它的思想是,把复杂的项目拆分为短小的迭代,每个迭代只关注一小部分的增量功能。因为每个迭代对应的编码只需要数周,所以功能易于管理并简单。
随着时间推移,问题是我们成为了老旧代码的奴隶,老旧代码变得不稳定和不兼容。而重构正好可以改变这一状况,因为我们是代码的主人,不是它的奴隶。重构在工程师和代码之间建立起持续的“对话”,并带来所有权、确定性、自信心和系统的稳定性。
千万不要成为老旧代码的奴隶。如果代码是他人所写,或许你可以轻易推脱责任。但大多数时候,那些代码是自己所写,要拿得起放得下,旧代码该埋时,就把它埋了!
3. 持续重构代码
重构背后的原始思想是:改善代码而不改变其功能,移动调整部分代码以确保系统不腐,还有确保系统完成基于当前需求该完成的事。持续重构可以让开发人员解决另一个著名的问题——“黑盒遗留代码”(这个问题基本无人想触及)。
4. 使用设计模式
模式就是不断重现的跨语言跨系统的场景和机制。一位优秀的工程师通常能识别并利用模式,而不是受制于模式。工程师不应(强制)让系统去适应某种模式,而需发现在系统中使用模式的时机(恰当使用模式)。在使用模式来确保正确性时,应借鉴利用前人的智慧结晶,使用以前能正当解决特定工程问题的方法。但请切记:模式不是万灵药;不要为了使用设计模式而使用设计模式。
5. 编写测试
6. 善用现有代码
“重新发明轮子”一直是软件行业中的巨大问题之一。从发明新语言到从写函数库,忽视并重写那些已经存在并已能工作的奇怪驱动力,已经造成大量软件开发的失败案例。一位明星工程师会专注三种基本类型的重用:第一,内部基础架构的重用,相应代码是他自己或同事编写的;第二,使用第三方的函数库,比如JDK。最后,研究使用某些大型网络服务商提供的相应服务,比如Amazon。总之,正确善用现有的代码,使得软件工程师能真正专注于最为重要的事情上——应用程序本身。
7. 专注可用性
优秀的工程师通常都专注于用户。无论用户是企业还是个人,无论是为消费型的软件公司还是投资银行,需要关注的都是可用性。用户如何和系统交互?系统是否提供一种简单、直接和平稳的操作体验?有种说法,因为软件工程师是技术人员,他/她和“用户如何与系统交互”没有关联,这种说法严重错误。优秀工程师努力工作是为了什么?不正是让系统简单并易于使用。他们无时无刻都会想到用户,不会尝试去发明那些令人费解,只有极客才能理解并欣赏的东西。
8. 编写可维护的代码
软件开发界的另外一个小秘密是:编写优秀代码和糟糕代码所花费的时间是一样多。一位训练有素的工程师,他/她会从第一行代码开始就考虑可维护性和代码的演化。没有任何理由编写“丑陋”的代码、长达数页的函数,或是稀奇古怪的变量名。优秀的工程师编写代码会遵循命名惯例,代码编写紧凑、简单和不过度炫耀聪明。代码的每一行,都应恰如其分地展现出其原有目的。在给不便理解的代码(块)合理注释时,别忘了命名规则。清晰明了的函数名和变量名可以让代码不言而明。
在编码时,有些程序员会有这种心态:过一会儿再来修改或完善某部分代码或某条语句。但谁知这一“过一会”竟然是“一天”、“一周”、“一个月”或“一年”,甚至以后根本就没机会再回头修改。所以,尽量别妥协写出暂时堪用的代码。否则,不仅不会节省开发时间,也可以阻碍整个进程。当然也不利于后续维护人员的工作。
9. 能用任何语言编程
编程所用语言,远远没有语言相应的函数库重要。优秀的工程师能够认知到这一点,并愿意去学习新语言、新函数库和构建系统的新方法。
10. 知晓基本的计算机科学
最后,但肯定不是优秀工程师最不重要的特质就是:扎实的基础。优秀的工程师或许并没有计算机科学的学位,但他/她必须知道基础——数据结构和算法。如果不知道哈希表,或者不知道链表和数组之间的差别,你如何构建一款大型的软件?。这些都是每位从事软件开发的开发人员应当知道的。算法也同样重要,从二分查找到各种排序,到图形遍历,一位明星工程师必须知道并内在消化这些基础东西。因为这些基础就是你在构建任何现代软件中做抉择时的必备品。
1.学习过程中刻骨铭心的痛会让你永远也不会忘记这些学到的东西。相信我,除此之外,你的信心也会得到难以置信的提升。
2.向所有的UNIX爱好者推荐unix.com和orafaq.com论坛 ,一开始你可能回答不上论坛里的问题。没关系,你可以浏览下问题和后面提供的答案。随着时间的推移,你就能够回答人们提出的问题。对我来说,我就是在这学到很多UNIX的知识。
3.无论何时你学到新东西或者遇到不同的事情,都与你的同事讨论和分享他们。就这些事情展开讨论,然后引导你的同事加入讨论。当讨论愈加激烈的时候,学习的效果越明显。有时你会发现讨论的或者你能分享的东西比你以前学到的还要多。这就是讨论的力量!
4.和后来者或者经验较少的同事讨论下问题会有意外收获。以一种他们易懂的方式向他们介绍下你的问题。但是不要向他们透漏你的思路,以免他们会被你诱导。你会惊奇的发现他们对这个问题会有完全不同的看法,这些看法可能被你忽视,异或问题的答案通常只是再普通不过的常识。经过一次这样的尝试,你会发现这是世上最给力的选择。你最好记住Shunryu Suzuki的这句话:“老手往往按部就班,新手却能另辟蹊径。”
Level 1,读写——他们了解设置Web服务器的方法,在普通情况下能够通过配置方式获取工作所需要的东西。他们有使用文本编辑器和文件系统的基础知识,还拥有移动和操作文件的能力,如ZIP和FTP。也能在结构中使用抽象符号、解析方式以及系统技能。
Level 2,脚本——能够编写线性脚本告诉电脑要做什么,能够学习和使用自己的符号。如果有足够的时间和书面指导,他们可以使用bash或VB编写一些简单脚本,为自己做些实用的事情。
Level 3,管理员——这些人了解库和API,并有能力学习更多。他们知道不管使用什么脚本语言都需要连接库。如果他们遇到问题,可以通过阅读使用手册或是在网上搜索库来解决。在工作中他能够发现或是开发自己的符号(使用struct编写函数或是声明)。大多数系统程序员都处在这个等级阶段,Excel的初级宏系统用户也同样处在这个阶段。
Level 4,高级实践者——刚开始接触耦合性与内核,他们能编写自己的对象化脚本(有公有/私有成员和方法)。这些人能玩转技巧,了解库和构建类。如果不使用类,他们也能够创建自己的模块或是代码文件。高级脚本用户可远不止这样,有一些Excel技巧经验丰富的股票经纪人,他们使用自己VBA作为基础代码,而没有意识到自己处于这个级别。
Level 5,掌握多种技能 —— 一旦上升到这个级别,将会遇到各种各样的麻烦。常见编程下一阶段就是能够使用多重框架。这些人可以编写 C# ,也知道如何创建表格和编写 SQL 语句;可以编写 C ,同时也会使用 JavaScript 和 HTML 。这两个技能并不代表他们就是大师,只是要学会在理解同一个问题上,需要通过多种不同的方式来找寻答案。Level 6,初级构架师——这阶段的人才算是真正的从事编程工作。他们每天的工作就是要深入了解库和API。并不要求他们必须记住这些,但要了解用不同的模式去实现自己的目标。想要在Win32中绘制?可能需要一些GDI资源句柄,他们知道句柄是在系统表某处的一个UInt32hash——常见的Win32范例。想在自己的库中添加jQuery?新库里有很多格式,他们应该知道怎么做并且能解释其工作方式。与此同时,也要开始学习如何重构自己的代码并突显亮点,增强其代码的质量,慢慢地你会理解。
Level 7,资深构架师——他们的时间是用来创建自己的API、平台或是库。也许这是一个大项目的必需品,也许只是他们个人想把自己的学识推广出去。他们开发的系统为用户解决实际问题,所面对的受众群是Level5程序员。在这个阶段需要深入OOAD,模板和实践。我们大多数人在刚开始都会搞得一团糟,不能理解怎么用更加简单的方法将复杂事情简易化。这个阶段需要历经很长时间,需要不断修正错误,开发高质量的系统并创建更复杂、灵活性高的库。当他们从外面接受几个月的特定培训回来,肯定希望团队其他人都能理解他做了什么。
Level 8,诠释者 —— 在某些时候,希望这些人能意识到大量复杂信息投入结构和构架中可以更好地形容特定域的语言,其受众群体是 Level4 程序员。代码的复杂性增大,就能减少代码的数量, DSL 开放可以将代码展示到各种地方。总之,他们将成为程序员使用脚本语言方面的作家。通过易于使用的脚本和导向将他们的系统开放给初学者。可以分别学习这些技能,但大多数情况是在复杂的结构后,最终走向 DSL 的道路。很快就能看到最初规模:利用自己编写的 DSL 能够很好的理解问题。Level 9,函数式编程——慢慢接近奖金,他们要开始学习如何函数式编程。其受众群是Level3的程序员。函数式编程是必不可少的,帮助他们轻松地脱离DSL,并能够大幅度减少代码数量来解决问题,同时拥有较高的扩展性。某些功能语言在系统运行时可以hot–swap,慢慢就会感觉到已经接近先进水平。函数式编程是一切问题的答案,它可以减少Bug,提升开发效率,但代码也相对来说很难学。程序员的脑海里需要时刻记忆很多东西——他们必须要记住繁琐的复杂符号。但是,结根到底函数式编程只是道路上的一个阶段,就像OOAD一样。
Level 10,面向语言设计师 —— 他们查看所有新创建的编程语言程序。惟一的区别是新语言应该做什么。他们了解如何开发面向对象语言,语言功能和脚本语言,知道每一个语言在何时何地的用途。其受众群是 Level2 程序员。他们对每一个项目都会问: “ 这个项目我们需要什么样的语言? ” 在项目完结后他们将会得到一个很好的工具,既解决了问题并易于理解还扩展了入门级程序员。大多数项目不需要面向语言设计师。