职业与工作方法github.com
成为软件工程师的计算机科学学习计划
A computer science study plan to become a software engineer
2017 — 2020,它一次次回到首页
黑点是上首页(≥ 50 分)的那次投稿,空心点是没冲上去的投稿,点越大分数越高。
导读
这个 GitHub 仓库是一份完整的计算机科学自学路线图,作者整理了大量数据结构、算法、系统等课程资源,目标是帮助没有 CS 学位的人通过自学和面试准备成为软件工程师。它最初是作者为进入谷歌而制定的学习清单,后来成为广受欢迎的开源项目。
为什么经久不衰:它既提供了可操作的自学路径,又持续引发关于 CS 教育、面试刷题与工程实践脱节的讨论,因此每隔几年就会被重新翻出来。
HN 评论精选
批评 CS 课程与大多数软件工程实际工作严重脱节,大厂面试标准并不代表日常工作。
这份关于数据结构、算法和软件基础的主题清单并不差,但别假装计算机科学和大多数软件工程岗位有多大关系。我学过计算机科学,30 年里几乎没用到多少。少数工作中统计和数学有点帮助,但在我漫长的职业生涯里,CS 和实际软件工程工作的重叠非常少。谷歌等大厂用这些标准在招聘阶段筛人,但绝大多数工作跟这些东西无关。
caymanjim查看英文原文
This isn't a bad list of topics about data structures, algorithms, and software fundamentals, but let's not pretend that computer science has anything to do with most software engineering roles. I studied computer science, and in 30 years, I've hardly used any of it. There were a few jobs where some of the statistics and math were helpful, but in my long career, I've seen very little overlap between computer science and working as a software engineer. Google and other big tech companies use these criteria to filter people out at the hiring stage, but the vast majority of work has nothing to do with any of this stuff.
指出作者本人没能进谷歌却去了亚马逊,并建议以刷题代替啃理论来通过编码面试。
剧透:作者后来写了篇文章《我没被录用,原因如下》。他收到谷歌拒信,连电话面试都没拿到,理由是找不到合适的团队。但他最终被亚马逊聘为软件开发工程师。假设你能进入面试阶段,最快的准备方式就是刷 LeetCode 最大化通过概率,这对系统设计和行为面试帮助不大,但比学 CS 理论更管用。
sxp查看英文原文
Spoiler alert: https://medium.com/@googleyasheck/i-didnt-get-hired-here-s-why-21f26d4784d5 > Last week I received a rejection email from the recruiter, and at first, I thought it was a mistake, and laughed it off. I checked in with my referral and he inquired into it and lobbied on my behalf, but in the end, it didn’t change the situation.... The thing that bothers me is that I didn’t even get a phone screen. I didn’t even talk to a recruiter over the phone. After all this work and enthusiasm, I didn’t even get a chance to prove myself.... After speaking with some folks related to Google, the best I can determine is that they decided to pass because there wasn’t a good fit on any teams where I might be qualified. This is in agreement with the rejection email I received — there were no roles fitting my experience and background. > I’ve been hired as a Software Development Engineer at Amazon! Assuming you can get to the actual interview stage, the fastest option is to prepare by just grinding leetcode to maximize your chances of passing the interview. That won't help with aspects like the system design or behavioral interviews, but grinding leetcode will give you a better chance of passing the coding interview compared to studying CS theory.
指出学习计划缺少分布式系统和工业级工具,而这些才是大厂实际工作的核心。
浏览课程大纲后,最大的遗漏是分布式系统和业界常用工具的实现。在大厂,你通常要在更大规模下工作,一个能跑的方案在 10 倍、100 倍、1000 倍规模下未必可行。你往往需要使用与单体 Web 应用架构不同的技术。我建议多学分布式系统工程师常用的工具:负载均衡 Nginx、键值存储 Redis、发布/订阅 Kafka、队列 SQS、Map/Reduce Hadoop/EMR、数据库 SQL。
nelsondev查看英文原文
From scanning through the course outline, the big omission is learning about distributed systems, and industry leading implementations of common tools. At big tech companies, you typically have to work at a much larger scale. A solution that works, won’t necessarily work at 10x, 100x, 1000x the scale. You often need to use technologies architected differently than a monolithic Web App. I would recommend learning more about the commonly used “tools” that a distributed systems engineer would use, more specifically: - Load balancer - Nginx - Key/Value storage - Redis - Pub/sub - Kafka - Queueing - SQS - Map/reduce - Hadoop, EMR - Databases - SQL
批评清单只是面试琐碎知识,缺乏应用判断力和数学基础,不能真正培养工程师。
很抱歉,这既不算完整,也不是成为软件工程师的计划。它只是一份琐碎知识清单,用来通过不懂行的 HR 部门组织的编码面试,那种面试把工程能力等同于记住考题答案。清单里的东西不会教你如何应用这些技术、何时应用(以及何时避开),而后者比记住如何平衡红黑树或排序列表重要得多。算法随时可以查,今天有几个工程师会自己实现而不是用库?但知道何时用哪种技术或算法才是关键。我还严重缺失数学基础:有组合数学(不错)和可选部分的一些几何,但数值数学、线性代数、统计和微积分基础呢?在大数据和 AI 热潮下,不懂基础你会寸步难行。
janoc查看英文原文
I am sorry but this is neither complete nor a plan how to become a software engineer. This is a list of trivia to get you through a coding interview conducted by a clueless HR department that equates engineering skill with remembering answers to test questions. Nothing more. None of the stuff in the list will actually teach you how to apply these techniques nor when to apply them (and when to stay away!) - which is much more important to know than to remember how to balance a red black tree or to sort a list. The algorithms you can always look up - and frankly, how often does an average engineer implement something like that today instead of using a library? However, knowing when to use which technique or algorithm is absolutely essential. What am I missing completely is foundations of mathematics. There is some on combinatorics (good) and some geometry in the optional parts, but where is numerical mathematics? Linear algebra? Basics of statistics and calculus? With the "big data"/AI crazes going on you will be dead in the water if you don't know at least the basics. Not to design the algorithms (that will be still way over your head) but to at least have a shot at understanding what you have to implement! Nobody is going to explain you how to multiply matrices or calculate a covariance there. Stuff like geometry and linear algebra is absolutely essential also for people programming computer games, anything related to virtual/augmented reality or robotics. Statistics is needed anywhere dealing with data but especially in AI, machine learning and computer vision. And basics of calculus are pretty much everywhere. So while the list is pretty useful as a reference, the title is seriously misleading.
历次讨论
同类还值得读
用十年时间自学编程(1998)
Teach Yourself Programming in Ten Years (1998)
Peter Norvig 1998 年的经典文章,回应“21天/24小时学会编程”一类速成书,主张真正精通编程需要约十年持续、有意识的练习。
职业与工作方法上首页 11 次 · 2007–2025norvig.com编辑精选如何成为一名程序员:简短、全面而个人的总结
How to be a Programmer: A Short, Comprehensive, and Personal Summary
一篇广为流传的程序员成长指南,作者以个人经验系统总结了成为优秀程序员所需的各项技能——从调试、测试、沟通到团队协作与身心健康。
职业与工作方法上首页 6 次 · 2008–2015samizdat.mines.edu编辑精选不要自称程序员
Don't Call Yourself a Programmer
经典职业建议文章劝软件工程师不要把自己局限在“程序员”这个标签上,而要从公司业务角度说明自己创造的价值;文中讨论了成本中心与利润中心、头衔、求职与职业选择,也顺带批评了学术界的价…
职业与工作方法上首页 5 次 · 2011–2021kalzumeus.com编辑精选创作者的日程与经理的日程
Maker's Schedule, Manager's Schedule (2009)
Paul Graham 在这篇文章里把时间表分成两类:管理者的日程以小时为单位,会议可以填满一天;创作者(程序员、写作者等)的日程则以半天为单位,需要长时间不被打断的连续块。
职业与工作方法上首页 5 次 · 2009–2021paulgraham.com编辑精选为什么程序员的薪酬不与生产力成正比
Why programmers are not paid in proportion to their productivity
讨论为什么程序员的薪酬往往不随其生产力成比例增长:生产力难以客观量化,薪酬更多受组织预算、岗位定价和个人议价能力影响。
职业与工作方法上首页 5 次 · 2009–2022johndcook.com