优秀的程序员会告诉你打根基的重要性,会劝你在厚积薄发前要隐忍。
+++基础的分割线+++
编程语言,《程序设计语言-实践之路》《concepts of programming languages》
计算机通用知识,《csapp》
算法、数据结构,《算法导论》
程序设计、结构,没有书推荐
软件工程,这个词大家理解不同,我以为,《人月》《代码大全》《the pragmatic programmer》《sicp》、讲测试讲重构的都是软件工程,其实上面设计模式也是软件工程,哈哈
这些书,初时读来感觉全无作用,而且要读多次才能体会其中意味,所以叫它根基也是十分合适,你根基越深才能爬得越高嘛。
+++方向的分割线+++
你想自己选自己的方向还是被人忽悠方向?
我的想法是自己都尝试玩玩,然后做自己喜欢的方向。当然,程序员的生态金字塔是上面做工具、基础设施给下面人用来给普通人编程序,所以你选方向可以参考一下这个金字塔模型
+++爬坑的分割线+++
方向定下,然后就是做事了,一大误区就是 【追求最好的东西】,于是非得弄清楚:
如果你是一个*nix世界的玩家的话,你应该知道有一个jargon来上面的毛病,叫yak-shaving,我以前提过几次yak-shaving,但是很多人看不懂,它的字面意思是Any seemingly pointless activity which is actually necessary to solve a problem which solves a problem which, several levels of recursion later, solves the real problem you‘re working on.
对了,像是不同范式的编程语言、不同的开发环境是应该尝试体验一下的,不过这种建议书上都写了,我这里说显得有些废话了。
所以说,不能被无关的东西弄偏了目标,要专注,坚持。
等你学深了一门语言,就算是学另一们其他范式的语言也不会太难,你学会了opengl,dx也就看看就能写了。
所以求多不如求专,深度到了,再花20%的时间去扩展一下广度即可。
+++重要的分割线+++
包装自己的第一步是提高实力
包装的第二步是定位
程序员的包装定位,无非稀缺和独特这两点。物以稀为贵,稀缺就是要做到不可替代,这很好理解,比如你知道世界第一高峰是珠穆朗玛峰,如果没看过禅师精选集你很难知道第二高峰是乔戈里峰,但文青特别偏好乞力马扎罗山,不爬不跟你结婚,为啥?独特性嘛。。。我不跟你比高,我和你比文化底蕴,于是就赢了。
由于你有实力,所以你应该尽量把自己的实力包装成稀缺属性,你是专家嘛。。然后你实力多,应该把独特的实力包装出来,避免和他人共同曝光,以免被人压在身下。
包装的第三步是推广
推广就是让人知道你做得好,强化你的个人品牌,可以用博客、知乎、mailing-list、github等,通过写文章、参加线下聚会演讲、回答问题、帮助他人等方法。这个用好了是门学问,用不好就是装逼,不展开了。。。
记住不要匿名,匿名你基本啥也得不到
有人明明技术实力强,但是由于没有包装好,或被埋没了才能,或被贴上了各种不应该有的标签,或被人偏见看待。比如 赵劼 的c#和 vczh 的微软标签
有人明明实力一般,但是善于鼓动小白,包装得好,所以有一批忠实粉丝,这种人我都不太敢说名字了,呵呵。。
+++结尾的分割线+++
要想优秀,得有巨大的推动力,你为啥想成为优秀的程序员?你的推动力是什么?
本科生应该学好啥?
我觉得本科生具体应该学好的知识如下 :
- 语言:C和scheme,两个极端范式足够了
- 数据结构和算法,《算法导论》
- 计算机系统,《csapp》
- 软件工程,《sicp》
以下任意内容可加分,具体加多少分看别人喜欢哪点:
- 并行算法和数据结构
- 编程语言理论
- 数据库、网络、编译器、图形、操作系统
- 测试
完。
如何进微软?
- 开拓视野,无论是编程语言、工具还是领域,都应该广泛尝试
- 多写、多读代码,感兴趣的都可以写、读
- 理解透彻,你经手的代码,要保证你从上层设计到底层实现都了然于胸,能在脑中回放数据在网络->内存->缓存->CPU的流向
要做好以上几点,必然要读好、学好这本书——《The Pragmatic Programmer》,程序员入门书,终极书,DRY,KISS。。。从做人到做程序员,包括上面说的几点,这本书教给了你一切,你所需的只是遵循书上的指导。
另外推荐你几本入门书:
《程序设计语言-实践之路》,程序语言入门书,这本书你现在就可以看,会极大扩展你的眼界,拉开你与普通人的差距。
《Structure and Interpretation of Computer Programs》,软件工程入门书,这本书请务必看完,可以不做完题,效果同上。
《Computer Systems: A Programmer’s Perspective》,计算机系统(软硬件)入门书。
龙书作为一本入门书,写得实在太过糟糕,据说Coursera上的斯坦福编译器课比较好,应该可以让你不用从龙书入门。
《The Design And Evolution Of C++》,你逃不掉对C++的学习,看这本书可以让你选择是成为守夜人还是守日人。。。。
《Code Complete》
特别推荐《the art of doing science and engineering》
进谷歌?
我觉得你得先找到一个技术方向,树立一个以此技术方向为首要目标的原则,做好这个方面的事情,对这个方面的所有技术细节都务求深入了解。
这是做好自己的本职工作,在做好这些事情的同时,你能力也就提高了。
总之就是不能三心二意,要专注。
然后呢,业余写些自己的小项目,就一直写啊写,写出来和别人的比比看,看看别人的设计和代码,然后改自己的,再写再改,如此再三,循环往复,设计能力和对编程原则的理解程度就逐步提高了。
为什么要写自己的项目呢?因为公司的工作它偏业务导向,且你未必能全部参与,业余项目可以来点纯技术流且全部由你一人完成,一来补补缺口,二来磨砺一下技术,你可以不断改啊改啊,公司里的事情可不是你想改,想改就能改。
我觉得编程就这两方面比较重要:
- 通过对细节的追求了解提高编程能力
- 通过循环往复地写程序改程序提高设计能力和对编程原则的理解程度
我为什么要标黑呢?大道理软件工程讲了无数遍了,哪个不是张口就来?哪个人不说自己很重视软件工程?但大部分人对于编码规范,最佳实践都是一副“我们是在搞工程,我们是创业公司,我们求快,我们不拘小节,我们要的是代码不是测试”的态度,我没在这种地方待过,不知道大部分半夜加班到底是修bug多还是加新功能多?
人生道理小时候就学光了,小学就学了今日事今日毕,中学就学了卖油翁,伐薪烧炭南山中,酌油沥孔钱不湿,惟手熟尔,可知乎上还不是天天有人要捷径,有人找捷径找了几年了都。。。
所以呢,你要多写,多被艹艹,体验之后,道理你就懂得深刻了
当然广泛交友扩展视野多尝试一些新玩具之类的事情,书上都写得很明确所以我就不重复了。。
哦对了。。。。面试前1个月开始刷算法和数据结构,刷一刷还是有必要的,很多东西久了之后虽然你知道但是裸写起来还是会磕磕绊绊,别人都刷你不刷,在面试官眼里你就是傻逼了。当然你不刷也能碾压别人的话,不刷也是可以的。。