知之为知之,不知为不知,是知也。
在近几年的学习生活中,愈发感到同样的学习课题,不同人之间学习深度与理解水平的巨大差异,在技术领域,或者说在笔者相对比较熟悉的算法领域,体现尤为明显。不理解技术的本质、不通晓其底层是不行的。彻底理解了底层,才算是掌握了核心科技。
从是否足够底层的视角,粗略来看,大致有四层学习境界。
包装层:功能性胡扯。如今的大学毕业生,纵使头顶着985211,双一流或者海归的头衔,大部分也不过只能停留在包装层的水平,只能谈谈肤浅的功能性的胡扯。譬如某某技术是用来做什么用的,往往说的天花乱坠,能够达成何等何等的伟业,渲染一波学术的气息,给不懂的外行人士装一装罢了。遇到同类,一般大作相见恨晚之态,开始心照不宣的商业互吹;遇到真正的专家、高手,则状若过街老鼠,避之不及,唯恐被揭穿,也有少许尚有廉耻心者,禁声默然;最无可奈何是一小撮最无耻者,对高人开始不忍直视的跪舔。
概念层:了解技术的优缺点,性能的主要影响因素,会定性分析。到这个阶段,也许就可以去参加产品发布会了,应对各界人士的问题至少可以做到有来有回,不算是个门外汉了。但是在具体的深入的技术层面,这个水平还仅仅是个大概了解罢了。
原理层:能画出流程图,通晓所有的理论过程,努力一下,还可以给出伪代码。到这个阶段,才算是真正沾了底层的边了。如果某门专业课程的学生在结课时都能达到这层境界,那主讲老师真的是一等一的教学高手了。可惜,如今的学生经常是做到这一层的都是少部分。
数理层/代码层:掌握了算法的数学本质,能够独立进行各种定量分析,同时有能力执行代码重现,如此便是触及了真正的底层境界。数理与代码并不是上下级的理解层级而应是水乳交融不可分割的。而有一类常见的现象却是,明白数学推导的人,却怎样也憋不出代码,而完全看不懂数学推导的程序员,却完美复现了繁复的算法原理。这种错位实际上源自不同算法对数理和代码的水平要求不尽相同。对于前者,这就属于编程水平的限制,并非理解问题,譬如Kmeans聚类算法,就属于数理易于理解而在代码实现上细节繁杂。对于后者,完全属于代码易于实现而造成的表面现象,只要具有一定代码水平,并不需要透析数学本质即可将算法照猫画虎,甚至还虎虎生风,比如某些图像处理算法。
学无止境,在这之后,应该还有更加深入的境界,随心所欲的可视化,甚至对算法的可拓展性实用性进行评估,才是更为“大成”的境界。
吾生也有涯,而知也无涯。底层之路,君问归期未有期。