郑亚斌:一个稳扎稳打的创业者
简介
郑亚斌,2009年电子科技大学本科入学, 2013年电子科技大学研究生入学。加入了首届bitman(紫宸的曾用名)。 研究生期间开始参与创业,研发AI图像和精确定位等相关产品。2018年作为联合创始人成立成都千焱科技有限公司,为云计算、区块链等行业提供高性能计算解决方案 。在2018年严峻的创业环境下,获得了非常可喜的成果。
还记得亚斌当年做了入组考察题目画板后,我们一起在那里看他的代码。在图形序列化的部分他采用了对象作为结构体直接存储的方式。简单快捷。但我知道这种方式的问题。我们一起看他提供的文字组件时,就发现了这种方法的问题所在。如果有指针成员(文字字符串的指针),这时,序列化的指针在反序列化时将形成悬空指针。
当时,看到他非常整洁的代码风格,并给出了我们没有要求的功能实现,我就觉得这个家伙有一些适合和代码愉快相处的特质。有想法,有行动,乐意折腾。没想到他去创业了。
他属于一个想得很清楚的人,并不单一的追逐分数。够用就行是他的选择。哪些属于够用,可不是60分万岁,他后面写的很清楚。
计算机系统能力
先说结论,我认为对于计算机软硬件系统结构的认知(以下简称系统能力),是一个程序员终生需要不断打磨的最重要的能力,是在这快速变化的IT领域保持长期竞争力的核心和关键。
是什么
所谓系统能力,包含并不限于对于如下具体内容的理解:
-
计算机组成原理
-
汇编语言与编译原理
-
链接与加载
-
操作系统原理及开源操作系统内核
-
并发编程
-
计算机网络
-
各种编程模式的思想,面向过程、面向对象、函数式、面向服务等
是不是看着很熟悉?没错,上述提到的科目绝大部分都是本科学习阶段的课程,但可以说绝大部分学生在学习的时候,即使是在当时考了一个不错的分数,离掌握精髓还差很远,更别说要把这些科目融会贯通,形成真正的系统能力。
为什么这么说呢?
重要性
对于一个软件产品,如果我们把它简单的分为:
-
功能:业务、界面、交互
-
性能:运行速度、稳定性、可扩展性(对于开发而言)
功能的丰富及特色可以让用户开始使用一款产品,但性能往往是其能够从同类竞品的长期竞争中脱颖而出的关键因素。
而提高软件的性能,靠的就是系统能力。
-
淘宝必须去优化后台架构的性能,使其可以支撑超级流量,否则UI做得再漂亮的双十一能成为全民购物节日么?
-
支付宝必须去优化其app的启动速度,使其可以在任何手机上都能实现秒开,否则如何在线下支付的场景与常驻后台的微信去竞争?
-
抖音、爱奇艺们必须去优化其在各级网络的视频分发、缓存,否则即使你有再好的内容,一个卡顿的视频网站会有多少人愿意使用?
-
由软硬件性能优化提升带来了更快的网络、便宜的流量,让音乐视频的下载“没有必要”,这甚至促进了国内音视频版权的正版化。
-
iOS、AI产品、游戏等等更多成功的软件产品,性能同样是它们能成功的关键因素。
可以说,任何成功的软件产品背后,都有强大的性能在为其支撑,否则它根本长不成现在的样子。
长期竞争力
如果打算将程序员作为一生的职业方向(对编程有发自内心的热爱),系统能力的修炼则是这个方向上的必经之路。
如果把程序员的能力是必做一颗技能树,系统能力就是这棵树的树根,算法能力(本文不提及)是主干。要想张成参天大树,其根要足够扎实。这样更多的枝叶(编程语言,框架等)可以不断丰富,并在成长中吸收来自根部的营养。
有了扎实的系统能力,在傲游于IT这个满是新鲜事物的大海过程中,犹如一盏明灯,使你不会被新东西的表象所困惑,抽丝剥茧,明白其“新”在哪,哪些东西是不变的,在哪些地方做了妥协。学习效率事半功倍。
对了,想要在复杂系统中debug的能力?好好修炼系统能力。
How
上文说明了系统能力的重要性,既然如此重要,且作为根基理应越早学习越好。那自然应该让凡是入门学习编程的学生都从一开始打好这个基础不是么?
但不得不承认,对于刚入门学习编程的学生而言,其包含的内容难免略显枯燥,远没有照着教程写一个安卓app来的有“成就感”。并且,在没有较多编程经验的情况下,直接学习这些知识,无法领悟到其对做一个软件究竟有什么直接帮助,也就没有成就感。
而成就感,其作为驱使一个程序员变得越来越好的动力,不亚于物质奖励。
因此,掌握一个良好的学习路径和方法论是极为重要的。
学习方法论建议
-
MNK(Minimal Necessary Knowledge):首先掌握最小必要知识,比如学一门语言首先学会搭环境然后跑hello world。
-
问题导向:对要学习的内容,根据自己的已有经验提出一个疑问。比如在准备学习计算机网络,那么我想要弄清楚,我的浏览器是如何做到跟服务器进行安全通信的?
-
自我猜测:对于第2步提出的问题,根据已掌握的知识加上常识,猜测可能的实现方法。比如操作系统是如何对多任务进行调度的,如果是我来实现一个调度会如何设计,当有多个处理器的时候又如何处理,现实生活中有没有类似的场景可以对应参考。
-
边学边实证改进:带着疑问和自己的猜测去学习。
-
因为是问题导向,过程中可以聚焦,不一定非得按照资料顺序依次学习。
-
最好同时参考同一个话题的多个作者的资料,对比其中对关键问题的阐述。
-
在学习过程中,当看到实际方案符合自己猜测时,给自己一个鼓励~。不符合猜测的时候,找寻自己思考逻辑的漏洞,或吸取资料中更好实现方式的设计思路。
-
用所学的内容做一个小项目,或将学习的内容通过一个小讲座分享给其他小伙伴。通过这种形式,可以非常好的巩固学习的效果,真正将其变成自己的知识,同时获得成就感激励。
本科期间学习建议
在这我根据自己十年左右学习及观察的经验,为本科阶段的计算机专业学生提供一个学习建议:
###大一:熟悉编程,培养习惯
-
使用Ubuntu等Linux桌面发行版作为自己的电脑主系统,熟悉命令、脚本的使用(ps,如果能自己搭一遍gentoo,那可谓是收获颇丰,但是对于新手而言难度较大)
-
熟练掌握C和python的基本用法,尝试分别用这两种语言去解决一些算法问题,了解两种不同类型语言的差异
-
线性代数和概率论这两门数学要好好掌握,未来很有用
大二:打好基础
-
花至少半年的时间,学习深入理解计算机系统(CSAPP)这本书,其包含了 二进制、汇编、编译、链接、CPU设计原理、缓存、并发编程、网络编程、异步编程 等 一系列系统能力所涉及的最小必要知识,是修炼系统能力的最好的入门书。一定花时间仔细阅读其中的内容,尽量完成每一道习题。
-
学习一个嵌入式操作系统内核源码,并将其移植到一个arm开发板
大三:聚焦方向
-
从上一条中,选取1~2个感兴趣的内容,学习相关的更深层次的资料。
-
如果以后想从事嵌入式相关的内容,那需要在汇编、CPU原理、linux内核、驱动开发等进行深入学习;
-
如果想往网站后端发展,那需要进一步学习并发编程、计算机网络、缓存设计等。
本科阶段,除了上述的知识内容,需要为自己规划1-2个长期的大项目。项目内容可以是紧跟流行技术的应用,但是在其中要通过某些点,锻炼你对系统能力知识的运用。这个项目也可以为你后续找工作加分。
在校学习时间安排
对于在校学习期间的时间安排,可以看出,上述给出的建议中,不少内容并不在学校的培养方案之内,并且学习进度有可能提前于学校安排,这可能导致时间不够用的情况出现。
这里根据我自己以及身边同学以往的学习经验详细谈谈(仅针对计算机专业):
-
首先,不要挂科,非常浪费时间精力。
-
英语非常重要!实际上,除了系统能力相关的知识体系,其余在工作和研究中需要用到的,往往都是比较前沿的技术和知识,英语可以说是前沿论文和技术文档的唯一语言,一定要重视!
-
大一大二的数理课程较多,核心专业课较少。数理课程的设置更多是为了照顾人才培养的全面性,如果你认定自己以后一定只会从事计算机类的工作,那在这类基础性课程中,可以有选择性的侧重学习。
-
常识是达到90分付出的时间代价至少是70分的三倍。
-
在线性代数和概率统计要做到优秀,微积分中等,这样同时可以兼顾工作以及读研的需求。
-
如果有准备读研的想法,假设你的计算机专业课成绩都很优秀,英语能力也不错:
-
考研,平时的其他科目保证不挂科的情况下少花精力。考研需要3~4个月时间准备,90%的时间用于巩固数学,专业课、英语、政治等抽时间看看就行。
-
保研,需要其他科目的分数保持在中等及以上水平,但是必定会在前两年花费大量精力去学习考试。但是不需要最后3~4个月的复习考研时间。
-
个人建议倾向于第一种,因为如果更多的时间精力花在计算机核心能力的提高上,在大三的暑假可能本来准备考研的你,通过面试已经可以拿到不错的offer。那这个时候没有太大必要继续考研,计算机不同于其他基础学科,更多的是一个实践性的领域,在一家靠谱的公司工作中真刀真抢的锻炼,学习收获并不会比读研究生差。
-
大三的时候,核心专业课的内容与上述学习建议中有比较高的重合,且课余时间相对充沛。此时如果你已经打好基础,在选课时可以注意:
-
大班课,完成课程对你来说应该是很轻松的事,更多的精力花在老师没有讲到的地方,按照自己的学习计划进一步深入探索。
-
小班课,往往内容会更深入,此时应该加大自己的参与度。往往在后期会有一个难度较大的课程设计,此时应是你的表演时间,拿出你的本事,让老师同学为你鼓掌。
关于我
计算机学院第一届拔尖人才计划工程组成员。
硕士期间参与校外企业工作,作为核心人员完成一个第三类医疗设备的研发。
现为成都千焱科技有限公司联合创始人,研发高性能计算相关产品。