我希望有人在我学习如何编码时告诉我的事情
在你开始学编程之前,先想清楚你想做什么样的东西
掌握编程的本质,是为了构建东西。当你清楚自己最终想实现什么,学习路径会变得更加清晰。如果你的目标只是“学会编程”,却没有一个明确的方向,比如你要写什么样的程序,它如何改善你的生活——那你很可能会觉得这个过程既混乱又令人沮丧。
我有点不好意思承认,自己当初选择学习计算机科学,部分原因是想证明自己很聪明,想找份“聪明人”才配做的工作。我确实喜欢数学和理论的思考(当年这本书曾深深震撼我),而计算机专业似乎正好契合这些兴趣。但这并不足以长期支撑我,直到我找到了把技术与我真正热爱的东西,比如音乐和文学,联系起来的方式。
所以,你想编程做什么? 是想开发网站?做游戏?写个 iPhone 应用?还是想创业发财?做交互式艺术? impress 老板?自动处理重复性任务好腾出时间看水獭的图片?或者你只是想提升就业能力、简历上多一个热词、或者满足学校课程的要求?这些目标都没有错。关键是你要清楚你自己的目标是什么,然后再选择相应的学习方向。
编程没有什么神秘的
编程是一种技能,就像其他技能一样。像学语言,你要掌握语法和词汇;像学数学,你要理解如何处理某类问题;像各种手艺或艺术创作一样,也有工具、有技术、有最佳实践——这些东西随着时间发展出来,适用于不同任务,你可以使用、修改甚至抛弃它们。
有位非常聪明(我常看他其他写作并深表赞同)的人认为,程序员与非程序员之间有一道“天才的分水岭”。他认为,是否能理解指针(pointers)和递归(recursion)决定了你是不是拥有“程序员的天赋”。
我是在学校里学到指针和递归的,掌握它们的那一刻,确实让我有种大脑被点亮的快感——那种智力上的满足感,正是我当初选择计算机科学的原因。但说实话,除了课堂练习,我实际开发中很少真的需要用到它们。而我在教别人编程时,也一次次看到有人不懂这些,却也能做出非常有趣、非常有成就感的项目。
所以,不要因为不懂某些高级概念就质疑自己的智商或“是否足够聪明”。确实,任务越复杂,所需的掌握程度就越高——但这是任何行业都通用的规律。除非你以后要靠写算法吃饭,否则你不必非得精通递归才能写出好程序。
程序第一次运行基本都不会成功
也可能第二次、第三次都失败
你开始学编程之后,很快就会遇到这种情况:你觉得自己一切设置都没问题,检查了好几遍,结果程序还是不工作。你完全不知道该从哪里开始查错,屏幕上的错误信息(如果幸运的话能有错误提示)看起来就像是在说:“操你大爷”。
这时候你可能会很想放弃,觉得自己太蠢、学不会编程。我第一次用 C++ 写程序时就有这种感受,运行后只出现“段错误(segmentation fault)”几个字。
但其实,这种情况对于所有程序员来说都非常常见,和你的智商、技术敏感度、是否适合写代码没有一毛钱关系。你是初学者会遇到这种情况,你成为资深程序员后也一样会遇到。唯一的区别在于你如何应对它。
我发现,新手与老手最大的差别是“信念”:
相信出错是有原因的
相信问题是能解决的
相信这个功能是可以实现的
虽然从“不工作”到“正常运行”之间的路径可能非常模糊,但只要耐心地一步步排查,最终你一定能解决它。
总有人会说你写得不对
大括号要换行。大括号要同行。用 Tab 缩进。Tab 是邪恶的。你应该用存储过程,但其实你不该用它们。你要写注释。好代码根本不需要注释。
几乎任何一个问题都可以有多种写法,没有唯一的“正确姿势”。很多程序员很擅长为自己的风格辩护,但这不等于那就是唯一解。
我刚入行那会儿,最痛苦的就是老被人说我写得不对,而我又很认真地去分析到底是不是他们说得对。这种焦虑挺耗人的。
如果你在团队中编程,有人肯定会质疑你的某个做法。
有时候他们是对的,你应该认真听取
但有时候他们就是在胡扯,或者是在复读某些已经争了几十年的“编程教条”
这时候遵循团队的代码规范(style guide)就行了,别和他们较真
当然啦,如果你是那种喜欢“无意义古老辩论”的人(比如语法控),那编程世界欢迎你加入战场。
总有人会说你不是“真正的程序员”
HTML 不算编程。你不用 vi 就不算认真。真正的程序员要会 C。真正的码农不用 Windows。有人学不会就是学不会。你不该学编程。你不是程序员(但我才是)。
“编程”对不同人有不同含义,现在的样子也早已和过去大不一样。
讽刺的是,那些能让新手快速入门、或者让开发者效率大大提升的工具和框架,反而经常被某些人贴上“这不是真正编程”的标签(参见:“真正的程序员又回来了”那类文章)。
这种“你不够格”的背后,其实是一种焦虑:
如果谁都可以说自己是程序员,那“程序员”这个称号是不是就贬值了?
但我认为,这种门槛守护行为其实是很有害的。
你应该使用那些能帮助你最快实现目标的工具。
如果你用 GameMaker 做出了一个游戏,而不是手写引擎,这没有问题;
如果你入门时只是写 HTML 或 Excel 宏,这也很好;
只要你能坚持下去、持续构建东西,就行。
随着经验增加,你自然会觉得这些工具限制多,开始转向更底层更强大的方式。但通常情况下,根本没人会看你用的代码是什么工具写的,大家只关心你做出来的东西。
为了“极客认证”焦虑只会慢慢吞噬你
如上所述。我以前在学校特别担心自己是不是暴露出“不是个真正极客”的一面:穿着打扮、读的书、装的软件、桌面主题……无一不让我焦虑。我浪费了大量精力在这上面。
后来我彻底放下,效率也提高了。
你必须牢记:你能不能成为一个好程序员,和你在各种“极客子文化”中的适应度毫无关系。
尤其是,如果你内心知道你其实永远也融不进去那些圈子,那就更应该别去证明自己了。
把那些精力省下来,拿去写点东西、做点有趣的项目,更有意义。
反过来,如果你就是个“满身 geek 气质”的人,那你在评价别人“够不够 geek”时也要多一些宽容。人家可能不像你,但并不代表他们不优秀。
坚持下去,比用哪种方法更重要
网上关于“最好的编程学习方式”的文章数不胜数,各种学习方式也五花八门:
看书学原理
在线刷题
改别人写的代码
视频教学
报编程班
各种语言轮番上场(Python、Go、Rust、JS…)
但很多初学者会遇到这样的情况:
初学部分轻松易懂,到了进阶内容突然陡峭提升,你知道如何打印输出,但完全不知道如何开始一个“真正的项目”。
你可能觉得自己只是照着教程做了,根本没学会;你可能责怪课程没讲透。但其实:
这就是你必须要面对的成长瓶颈期。
而且到了这个阶段,你在网上能找到的大部分资料,要么太浅、要么默认你已经很懂了。更糟的是:
“你不知道自己不知道什么”,所以连该学什么都找不到方向。
这时候,最重要的不是换教程,而是继续坚持下去。
多尝试不同的小项目
多问问题
一点点把拼图拼完整
只要你能明确自己“为什么想学编程”,坚持得足够久,总有一天你会学会的。
如果你能一直把砖一块一块往上砌,可能很慢,但总有一天,你就会造出一堵墙来。
这时候,前面说的“信念”就显得特别重要:
只要你相信自己终究能搞明白编程这件事,迟早你就会成功。