言必信,信必果。
我是一个 2 岁的码农。
与 Madao 立约,写一篇博客,遂有此篇。
回顾工作的两年,做一次梳理与总结,分享给我的同龄人,也是给自己一个交代。
一个人,一口箱子。
一个沉默平凡的人,提着一口陈旧平凡的箱子。
——《英雄无泪》
作为一个码农,应该有一口箱子,刻着自己的名字。
MacBook Pro 15,Mac 显示屏,HHKB Pro 2(Type-S)
拥抱 GNU/Linux
有时间就研究一下 Minix 3
命令行工具
文本编辑器
Atom 编辑后端代码,VSCode 编辑前端代码,实际上都在使用 Vim
有时间折腾一下 spacemacs
我是一个沉默平凡的人,提着一口陈旧平凡的箱子,在满天夕阳下,默然的走入了软件开发行业。
常山在这里……我们现在在这里,若我们能助主公在这版图上杀他一个大圈,那个时候就会天下太平,我们也可光宗耀祖地回常山了!
这么大一个圈我们能走完吗?
小伙子,好好跟着你大哥,我一定会带你走完这张图!
——《见龙卸甲》
我的本科和研究生专业都是教育技术学,非科班出身;我爱 (Zhe) 智 (Xue) 慧,追求对事物完备而根本的认知。先博后渊,意味着要先做一名通才,后做一个专家,最后,做一个 T 型人才。我们需要从技术跨到产品,从分析一个需求到实现一段可运行的代码,要经历一个漫长的螺旋上升的过程,需要多个角色参与其中,很显然,我们需要不时地切换视角。
编程只是使用计算机解决问题过程中的一个环节,使用一种或多种编程语言描述解决方案,将解决方案转化为可工作的软件。在这里,我们只关注编程语言及编程语言转化。
编程语言五花八门,我们倾向从主流的编程语言中做选择。
选择是把双刃剑,决定权还是在你手里。
事实上,你不会只学一门编程语言,但凡能够改变你编程思维的语言,都值得学习。
- C - Scheme - JavaScript - Ruby - Python - ...
学习一门编程语言的最权威的学习资源就是官方文档或语言手册。
学习一门编程语言的不二法门就是使用它。
使用一门编程语言构建程序大致有两种方式,一种是自顶向下,另一种自下而上。一般而言,我们在学习第一门编程语言的时候,我们通常采用自下而上的方式,即学习编程语言提供的一些支持,如各种运算、选择、循环等,在此基础上处理一些简单的问题,然后慢慢去处理一些复杂的问题。当我们学习第二门编程语言时,我们有了使用第一门编程语言处理问题的经验,我们通常会采用自顶向下的方式,对问题尝试去拆解,看看第二门语言能提供哪些支持。因此,大多数人建议,选择一门语言,然后精通它,用它处理所有问题,直到它难以或无法处理遇到的问题,再去考虑选择第二门语言。
我想把这种编程语言的转化方式称为细化。
细化到什么程度,只要满足你的好奇心就好。计算机系统的“分层抽象”设计,让你无需关注所在层之外的其他层。大多数人应该都会认为,我只要熟悉编程语言的语法,编程语言内建接口,实现功能就好了,最多熟悉 N+1 或 N-1 层就够了。这个没有错,但是无法满足我的好奇心。
我将 01 作为一条分界线,作为细化的底线。01 的物理实现可以是电流通断、电平高低或其他方式,布尔运算可以用门电路实现,我虽然不知道控制器、运算器、内存、IO 控制器的物理实现,但是我对此不感到神秘,无非是一些组合或时序电路实现的,是可以理解的。由此可以假定,我知道计算机是可以理解 01 位串的,计算机有它的语言,就是机器语言。
使用 01 编程,计算机可以理解,但是我们难以理解,需要查表,才能知道是什么操作。借助符号表,我们使用汇编程序实现了机器语言到汇编语言的转化;如果你写过汇编程序,你会发现理解寻址模式和记忆汇编指令并不难,难点在于程序的规划,处理复杂的无关问题本身的细节,我们需要实现汇编语言到高级语言的转化,如 C 程序设计语言,这个需要熟悉词法分析和语法分析以及很多编译器和解释器相关知识,才能很好的理解这种转化。
词法分析 —— 词法分析器 —— 正则文法 —— 正则表达式 —— ... 语法分析 —— 语法分析器 —— 上下文无关文法 —— 巴科斯范式 —— ...
如果有时间,我想可以再深入学习,人的精力毕竟是有限的,我还有其他的事情要做。
我想把这种编程语言的转化方式称为特化。
代码库和开发框架是围绕一门编程语言建立起来的,可以视为领域特定语言。
理解编程语言转化(II)要比理解编程语言转化(I)简单的多,你只需要掌握基本的代码阅方法。
代码库和开发框架的编程语言应用层面的东西,可以通过阅读源码,来检视自己对编程语言本身的掌握情况。读了 jQuery 源码 和 ActiveSupport 源码,我就对库和框架的神秘感消失了,我想只要付出时间和精力,我就可以理解。
文件管理和进程管理
TCP/IP 协议 和 Socket 编程
我们可以从 IC 开始构建整个计算机系统,这个过程跟编程语言转化的过程类似,通过分层抽象,我们可以自顶向下或自下而上地构建。幸运地是,可以通过软件去模拟硬件,完成这个思维实验,只需要一台电脑和大量的书籍或海量的网络资源,当然,还有你的精力和时间。
理解计算机网络,重要的是理解 TCP/IP 协议,最终体现为 Socket 编程,可能还有更多方面。
这是根本!
我认为是产品与技术的分界,构建正确的产品与正确地构建产品,完备而根本。
这是我觉得作为一个研发人员发挥价值的地方。
验收测试保证“构建正确的产品”,单元测试保证“正确地构建产品”。
测试是重构的前提,测试可以辅助设计,也是活文档。
重要的是,测试让我们编写自信的代码。
你可以将枯燥难学的算法、设计模式、软件架构统统加以尝试。
我觉得这对我而言是一个发现,我可以把我没有掌握的东西挂起来,等适当的时候再去处理。就拿设计模式举例,我觉得最有用的一个设计模式就是“你可能用不到它”,我可以等到代码重构的时候,考虑是否需要某个设计模式。
发现问题的能力
矛盾推动事物的发展,我们在发现问题和解决问题中成长。解决问题固然重要,发现问题更为重要。你只有发现了问题,才有解决问题的可能,重要的是,你要主动发现问题,不要等着别人告诉你,有些问题别人可能想不到,有时候即使想到了也不会主动告诉你。提前发现问题,可以少走不少弯路。
解决问题的能力
作为新手,往往试图通过技术手段解决问题,由于技术不够熟练,花了很多时间,没有解决问题。大多时候,解决问题需要取巧,并不是所有问题都有必要通过技术解决,技术只是一种手段,而且是代价较高的手段。记住小平同志的那句话,黑猫白猫,抓住耗子就是好猫。尽快脱离学习状态,进入工作状态,先完成后完美,学习在工作之后,学习在工作之上。
代码阅读的能力
如果有文档,请先阅读文档。
阅读高质量的代码,提高代码的品位。
如果你具备一定的代码阅读能力,借助 Google 和 Stack Overflow,就可以解决你遇到的 80% 的问题。
软件调试的能力
Bug 无处不在。你需要掌握 Debug 的能力,这里有可遵循的方法。
组织与沟通的能力
你需要组织自己的时间、精力去高效地完成工作。
你需要与人协作,要会沟通。
有两种东西,我对它们的思考越是深沉和持久,它们在我心灵中唤起的惊奇和敬畏就会日新月异,不断增长,这就是我头上的星空和心中的道德定律。
——《实践性理性批判》
我编程,我快乐!
生有涯而学无涯!
我之谓也。且夫我尝闻少仲尼之闻,而轻伯夷之义者,始吾弗信,今我睹子之难穷也,吾非至于子之门,则殆矣,吾长见笑于大方之家。
——《庄子·秋水》
毕竟只有 2 岁,有些言语可能幼稚甚至错误,这也是难以避免的。
待更新……
欢迎大家指正!