How to be a Programmer 中文版
现在已经生成了gitbook,适合阅读,并且可以方便地导出PDF。
如果你想要一起来改进这份翻译,可以给我提PR,不过希望翻译时尽量保持作者的原意。
文章中出现的一些词汇往往有特殊的含义,可以在4-词汇表找到注释。
引言
做一个好的程序员,困难而高尚。将一个软件工程集体愿景变为现实,最困难的地方在于与你的同事和顾客相处。编程很重要,这需要强大的智力和技能。 但在好的程序员看来,相比构建一个让客户和各种各样的同事都满意的软件系统,(纯粹的)编程真的只是小孩子的玩意。在这篇文章里,我尝试尽可能简洁地总结那些当我21岁时,希望别人告诉我的事。
这可能很主观的,所以,这篇文章注定不适用于所有人,并且有的内容有点武断。我尽量写一些程序员在ta的工作中,非常可能会遇到的事情。大部分这些问题以及它们的解决方案在人们的环境中如此普遍,以至于我(说的)可能有点唠叨。尽管如此,我还是希望这篇文章是有用的。
我们在课堂上学习编程。 那些著作: The Pragmatic Programmer [Prag99], Code Complete [CodeC93], Rapid Development [RDev96], 以及 Extreme Programming Explained [XP99] 都传授编程(知识),并阐述做一个好的程序员这个大话题。 在读这篇文章之前,或者就是现在,你当然也应该读一读Paul Graham [PGSite] 和 Eric Raymond [Hacker] 的文章。 但与那些著作不同,这篇文章强调社交问题并且总结了整套我所知的必须的技能。
在这篇文章里,boss这个词指的是任何一个交给你工程去做的人。 除了一些语境外,我会同义地使用交易,公司,集体这些词,比如,交易意味着赚钱,公司意味着现代的工作空间,集体一般是那些你一起工作的人。
欢迎来到这个群体。
目录
- 入门
- 个人技能
- [学会Debug](1-Beginner/Personal-Skills/01-Learn To Debug.md)
- [如何分离问题debug](1-Beginner/Personal-Skills/02-How to Debug by Splitting the Problem Space.md)
- [如何移除错误](1-Beginner/Personal-Skills/03-How to Remove an Error.md)
- [如何用Log来Debug](1-Beginner/Personal-Skills/04-How to Debug Using a Log.md)
- [如何理解性能问题](1-Beginner/Personal-Skills/05-How to Understand Performance Problems.md)
- [如何解决性能问题](1-Beginner/Personal-Skills/06-How to Fix Performance Problems.md)
- [如何优化循环](1-Beginner/Personal-Skills/07-How to Optimize Loops.md)
- [如何处理I/O开销](1-Beginner/Personal-Skills/08-How to Deal with IO Expense.md)
- [如何管理内存](1-Beginner/Personal-Skills/09-How to Manage Memory.md)
- [如何处理偶现的Bug](1-Beginner/Personal-Skills/10-How to Deal with Intermittent Bugs.md)
- [如何学习设计技能](1-Beginner/Personal-Skills/11-How to Learn Design Skills.md)
- [如何进行实验](1-Beginner/Personal-Skills/12-How to Conduct Experiments.md)
- 团队技能
- [为什么预估很重要](1-Beginner/Team-Skills/01-Why Estimation is Important.md)
- [如何预估编程时间](1-Beginner/Team-Skills/02-How to Estimate Programming Time.md)
- [如何搜索信息](1-Beginner/Team-Skills/03-How to Find Out Information.md)
- [如何把人们作为信息源](1-Beginner/Team-Skills/04-How to Utilize People as Information Sources.md)
- [如何优雅地写文档](1-Beginner/Team-Skills/05-How to Document Wisely.md)
- [如何在垃圾代码上工作](1-Beginner/Team-Skills/06-How to Work with Poor Code.md)
- [如何使用源代码控制](1-Beginner/Team-Skills/07-How to Use Source Code Control.md)
- [如何进行单元测试](1-Beginner/Team-Skills/08-How to Unit Test.md)
- [没有思路的时候,休息一下](1-Beginner/Team-Skills/09-Take Breaks when Stumped.md)
- [如何决定下班时间](1-Beginner/Team-Skills/10-How to Recognize When to Go Home.md)
- [如何与不好相处的人相处](1-Beginner/Team-Skills/11-How to Deal with Difficult People.md)
- 个人技能
- 进阶
- 个人技能
- [如何保持充满动力](2-Intermediate/Personal-Skills/01-How to Stay Motivated.md)
- [如何才能被广泛信任](2-Intermediate/Personal-Skills/02-How to be Widely Trusted.md)
- [在时间和空间之间该如何权衡](2-Intermediate/Personal-Skills/03-How to Tradeoff Time vs Space.md)
- [如何进行压力测试](2-Intermediate/Personal-Skills/04-How to Stress Test.md)
- [如何权衡简洁与抽象](2-Intermediate/Personal-Skills/05-How to Balance Brevity and Abstraction.md)
- [如何学习新技能](2-Intermediate/Personal-Skills/06-How to Learn New Skills.md)
- [学会打字](2-Intermediate/Personal-Skills/07-Learn to Type.md)
- [如何进行集成测试](2-Intermediate/Personal-Skills/08-How to Do Integration Testing.md)
- [交流语言](2-Intermediate/Personal-Skills/09-Communication Languages.md)
- [重要的工具](2-Intermediate/Personal-Skills/10-Heavy Tools.md)
- [如何分析数据](2-Intermediate/Personal-Skills/11-How to analyze data.md)
- 团队技能
- [如何管理开发时间](2-Intermediate/Team-Skills/01-How to Manage Development Time.md)
- [如何管理第三方软件风险](2-Intermediate/Team-Skills/02-How to Manage Third-Party Software Risks.md)
- [如何管理咨询](2-Intermediate/Team-Skills/03-How to Manage Consultants.md)
- [如何适度交流](2-Intermediate/Team-Skills/04-How to Communicate the Right Amount.md)
- [如何直言不赞同以及如何避免](2-Intermediate/Team-Skills/05-How to Disagree Honestly and Get Away with It.md)
- 评判
- [如何权衡开发质量与开发时间](2-Intermediate/Judgment/01-How to Tradeoff Quality Against Development Time.md)
- [如何管理软件系统依赖](2-Intermediate/Judgment/02-How to Manage Software System Dependence.md)
- [如何评判一个软件是否太不成熟了](2-Intermediate/Judgment/03-How to Decide if Software is Too Immature.md)
- [如何决定购买还是构建](2-Intermediate/Judgment/04-How to Make a Buy vs Build Decision.md)
- [如何专业地成长](2-Intermediate/Judgment/05-How to Grow Professionally.md)
- [如何评估面试](2-Intermediate/Judgment/06-How to Evaluate Interviewees.md)
- [如何知道何时实施昂贵的计算机科学](2-Intermediate/Judgment/07-How to Know When to Apply Fancy Computer Science.md)
- [如何与非工程师交谈](2-Intermediate/Judgment/08-How to Talk to Non-Engineers.md)
- 个人技能
- 高级
- 技术评判
- [如何从不可能的事情中找到困难的地方](3-Advanced/Technical-Judgment/01-How to Tell the Hard From the Impossible.md)
- [如何使用嵌入型语言](3-Advanced/Technical-Judgment/02-How to Utilize Embedded Languages.md)
- [选择语言](3-Advanced/Technical-Judgment/03-Choosing Languages.md)
- 机智地妥协
- [如何与时间压力作斗争](3-Advanced/Compromising-Wisely/01-How to Fight Schedule Pressure.md)
- [如何理解用户](3-Advanced/Compromising-Wisely/02-How to Understand the User.md)
- [如何获得晋升](3-Advanced/Compromising-Wisely/03-How to Get a Promotion.md)
- 服务你的团队
- [如何发展才能](3-Advanced/Serving-Your-Team/01-How to Develop Talent.md)
- [如何选择工作内容](3-Advanced/Serving-Your-Team/02-How to Choose What to Work On.md)
- [如何从你的同伴身上获得最大收益](3-Advanced/Serving-Your-Team/03-How to Get the Most From Your Teammates.md)
- [如何分割问题](3-Advanced/Serving-Your-Team/04-How to Divide Problems Up.md)
- [如何处理无趣的问题](3-Advanced/Serving-Your-Team/05-How to Handle Boring Tasks.md)
- [如何为一个工程获取支持](3-Advanced/Serving-Your-Team/06-How to Gather Support for a Project.md)
- [如何发展一个系统](3-Advanced/Serving-Your-Team/07-How to Grow a System.md)
- [如何高效交流](3-Advanced/Serving-Your-Team/08-How to Communicate Well.md)
- [如何把别人不想听的话说给他们听](3-Advanced/Serving-Your-Team/09-How to Tell People Things They Don't Want to Hear.md)
- [如何处理管理神话](3-Advanced/Serving-Your-Team/10-How to Deal with Managerial Myths.md)
- [如何处理混乱的组织](3-Advanced/Serving-Your-Team/11-How to Deal with Organizational Chaos.md)
- 技术评判
- 词汇表
- 附录 A - 书籍/网站
- 附录 B - 历史 (至2016年1月)
- 附录 C - 贡献 (至January 2016)
How To Be A Programmer: Community Version by Robert L. Read with Community is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.