文/一个写了十年代码才明白”编程”是什么的人
昨天翻到一个旧U盘,里面有个文件夹叫”我的编程学习”。点进去看到最早的一个文件,创建于2011年3月,文件名是”helloworld.cpp”。
我盯着那个文件看了很久。那是我的第一个程序,在大学机房的Turbo C里写的。但让我愣住的不是这个文件本身,而是这个文件夹的”时间线”——从2011年3月的Hello World,到2016年8月的第一个正式上线的项目,中间隔了整整五年零五个月。
也就是说,从我第一次写下那行cout << “Hello, World!”;,到我真正做出一个有人用的软件,中间花了将近两千天。
这两千天里,我不是没学过,不是没写过代码。我上过C语言的课、学过Java、折腾过PHP、跟风搞过Android开发。但所有学的东西都是”学过”,从来没有真正做成过什么。那些代码要么是课后作业,交了之后再也没打开过;要么是照着网上的教程一步步跟着做,做完之后连自己都不记得逻辑是怎么走的。
我花了五年时间,才从一个会写Hello World的人,变成一个能做出软件的人。
第一年:我以为会写代码就等于会做软件
刚学C语言那会儿,我觉得自己能写一个从键盘读入两个数然后输出它们之和的程序,就已经很了不起了。那时候”软件”在我脑子里是一个模糊的概念——大概就是把很多这样的程序堆在一起,然后加一个好看的界面。
所以我的学习方法是:学语法、学函数、学指针、学文件操作。把课本上的每个知识点都搞明白,把课后习题都做完,然后等着有一天”软件”自然就会做了。
它没有自然出现。
我学完了整本C语言教材,打开一个空白的编辑器,发现自己依然不知道怎么写一个”软件”。我知道怎么定义一个结构体,但不知道一个记账软件的数据该怎么存。我知道怎么用fopen打开文件,但不知道用户的配置信息该放在哪里。我知道怎么写循环和判断,但不知道一个程序的流程到底该怎么组织。
那种感觉很糟糕。你觉得自己学了很多东西,但站在一个空白页面面前,什么都写不出来。
第二年:我学会了”抄”
后来我发现一个现象:周围那些看起来”会做东西”的同学,并不是比我多懂多少语法,而是他们知道去哪里找”别人是怎么做的”。
他们会上GitHub看开源项目的代码结构,会搜”xxx项目源码”然后下载下来一行一行看,会在论坛里找别人分享的小项目完整代码。然后他们把这些东西”拆”开来——看别人怎么建文件夹、怎么分模块、怎么写配置文件、怎么处理异常。拆完之后,他们模仿着重新写一个类似的,功能不同,但结构一致。
我也开始这么干。第一个模仿的项目是一个简单的留言板。我用PHP写后端,用最原始的HTML写前端。别人的代码用了MVC结构,我也照搬。别人的数据库有三张表,我也建三张。别人的路由是这样写的,我跟着写。
那个留言板很丑,功能也弱,能发留言、能显示留言列表就没了。但那是第一个”我自己写的、能跑在浏览器里、别人能打开访问”的东西。
我把它部署到一个免费主机上,把链接发给了我大学宿舍的群。那几个家伙在里面留了几十条言,全是骂我的。但我看着那些骂人的留言一条条出现在页面上,第一次觉得自己写的东西”活”了。
第三年:我掉进了”框架陷阱”
有了留言板的经验之后,我膨胀了。我觉得自己行了,可以搞大项目了。然后听人说现在做Web开发都用框架,不用框架的都是原始人。
我开始学框架。今天听说Laravel好,学了两周。明天听说ThinkPHP国内用得多,又转过去。后天觉得Spring Boot才是正统,开始啃Java。
每个框架都是从Hello World开始。建立项目→写一个路由→输出”Hello, World!”→能看到页面→好,我学会了。然后开始学下一个框架。那一年我”学会”了四五个框架,但没有用任何一个做出过第二个项目。
每一个都卡在”Hello World之后”——我要写真正的业务逻辑了,数据库怎么连、模型怎么建、表单怎么验证、权限怎么控制。文档翻了几十页,越看越迷糊,然后放弃,换下一个。
后来我才意识到,我是在用”学框架”来逃避”做项目”这件事。学框架是安全的、有边界的、有明确对错的。做项目是不确定的、会遇到各种没见过的坑的、可能做到一半做不下去的。我躲在框架的Hello World里,假装自己每天都在进步。
第四年:我做了一个”能用”的东西,但没人用
这一年我终于硬着头皮做完了一个完整的项目——一个图书借阅管理的后台系统。有登录、有图书管理、有借阅记录、有统计报表。花了我三个月的时间,代码写了一万多行。
我把它部署到网上,兴冲冲地推荐给身边的朋友用。结果没人用。
不是系统有问题,是”没人需要”。我朋友不管理图书馆,他们不需要一个图书借阅系统。我做了一个功能完整的软件,但它解决的”问题”不是任何真实用户的问题。
那三个月让我明白了一件事:软件存在的唯一理由,是解决某个人的某个问题。如果你的代码解决不了任何人的任何问题,那它本质上就只是一个大型的Hello World——能跑,但没有意义。
第五年:我找到了那个”问题”
第五年,我帮一个做辅导班的朋友做了一个简单的排课工具。他要解决的问题很具体:几个老师、几十个学生、一周七天、不同的时间段,怎么把课排开不冲突。
这个问题的复杂度不高,但它是真实的。有人每天被它困扰,而我可以用代码把它解决掉。
我花了两个周末写完了那个排课工具。代码质量远不如我之前那个图书管理系统——结构松散、没有单元测试、界面丑得不行。但它有人用。那个朋友用了之后跟我说”省了我每周两小时的时间”。
两小时,乘以一年五十周,是一百个小时。我用两个周末换来了他的一百个小时。
那一刻我才真正理解:软件的价值跟代码质量、用了什么框架、设计模式好不好看,没有任何直接关系。软件的价值只跟一件事有关——它是否让某个人的某个问题变简单了。
从那之后我再也没纠结过”用什么框架””代码要不要重构””要不要加设计模式”这些问题。我唯一关心的问题是:这玩意儿解决谁的什么问题?怎么让它把这个事情解决得再好一点?
那些弯路,后来都成了路
现在回头看那五年,每一段弯路都不白走。
第一年的语法学习让我后来写任何语言都能快速上手。第二年的”抄”让我学会了项目结构该怎么搭。第三年的框架学习让我了解了不同设计理念的优劣。第四年的白用功让我明白了用户视角的重要性。第五年的小工具让我找到了做软件的意义。
如果没有这些弯路,我可能永远停在那个Hello World的阶段——知道怎么写代码,但不知道代码该往哪里去。
所以如果你现在刚写完Hello World,正站在那个”接下来该干嘛”的路口,我想告诉你的是:你一定会走弯路。你一定会学到一些后来用不上的东西,一定会做出一些没人用的东西,一定会在某个框架的Hello World里自我感觉良好然后不了了之。
这都没关系。弯路也是路。只要你在走,只要你在写,只要你在”做”——哪怕是做错——你就在往前。
那个从Hello World到第一个真正上线的项目之间的五年,我走了很久。但每一步都算数。
包括第一步。