1.怎样从零基础开始沉淀成为cnc工程师?
2.大佬那么多,菜鸡为什么不能是源码我 | 卡颂2020年终总结
3.嵌入式学习路径之Linux|我说这是嵌入式全景图,你没意见吧?
4.STL 源码剖析:sort
怎样从零基础开始沉淀成为cnc工程师?
第一,网菜程序员可以学习的鸡代更快。
第二,菜鸡每个人都可以通过努力改变自己的源码类似滴滴软件源码人生轨迹。
是网菜的。我很早就思考这个问题,鸡代每个人都应该有证明自己的菜鸡机会,可是源码很多人想要得到这个机会,就必须要在简历上弄虚作假。网菜
而经常会有Java工程师,鸡代工作了3到5年,菜鸡还纯真的源码像一个刚毕业的孩子,什么都不懂。网菜
如果从零基础成为一个可以上手独立做项目的工程师,倒底是需要多久?
如果一个人在学校里泡妞打架熬夜玩游戏,是否有可能会在一个短的时间之内醒悟,改变自己的命运?
他又能做到什么程度?
是的,没错。修真院线下多个师兄,确切的来讲,都是我的实验品。
幸运的是,几乎是百分百的实验成功。
这篇文章,就是仔细认真的讲一讲,我对IT技术职业培训的认知。
以及修真院是如何践行自己的理念。
如果你认真的看完了,你就会明白,需要改变的并不是修真院,而是你。
二 程序员的分级
首先谈一个备受争议的话题,程序员该怎么分级别。
在修真院眼里看来,只存在三种级别的程序员,除此之外,并无意义。
初级程序员:能够独立完成项目。工作经验一般在0~3年之间。这样的程序员遍地都是。
中级程序员:能够了解开源框架的原理和技术细节,能够比较各种框架的优势,可以带着团队去做项目。工作经验一般在2~7年之间。大部分程序员一生都只能达到这个高度。
高级程序员:世界上最顶级的一批人,流行的框架,语言,协议,规范的117源码作者。
抛开这个分类的准确性和认可度不提,先只说,为什么要先提给程序员分类的问题。
这取决于大多数公司招聘的门槛:如果你可以独立完成项目,你就有了真正可以选择公司的权利。
初级程序员的分类就是为了将当前混杂的描述变成一个可实际操作的,能够验证的结果。
同时又给出来了一个人要上升到另一个台阶的标准。
修真院的目标就是在一定的时间之内,让初学者能够成为一个可以独立完成项目的工程师。
而目前大多数的培训机构,都很难做到这一点。
三 当前培训机构的分类
再说一些培训机构的分类。
总体来讲,分成三类。
第一种,以某内,某鸟为首的宽进宽出类。
培养出来的程序员,离真正上手能做项目,通常仍然有6个月到1年的距离。
第二种,以BAT的大牛为招牌各类小型培训机构的严进严出类。
培养出来的程序员,基本上都是要求很高,科班出身,英语要好,必读原理,强调算法。
第三种,修真院独一家的脚踏实地类。
对学员的入门要求高,但是并不是对学历,性别,基础要求高,而是对态度要求高。
对学员的结业目标要求高,又考虑到零基础转行的人的现状,明确的指向一个绝大多数人都可以完成的正常目标。
别管什么样的培训方式,线上的还是线下的,看视频的还是真播的,写代码的还是任务制的,入门要求高的还是低的,培养前端的,还是后端的。
都可以用这种方式简单直接的分类。有了这个分类,修真院要做的目标就很明确了,零基础到能独立完成项目的程序员。
你再笨,unimrcp源码也不过是时间延期了一些而已。你如果真的很厉害,那么你完成可以学到更多的知识点。
这是一个对于大多数人来说,都认可的结果。
不是每一个想要转行的人,都必须要在一个很短的时间之内,把所有必须的知识点补全。
“学以致用”,这个思考贯穿始终。
四 确定学习的边界
目标明确了,进一步的思考就很显然了。
一个程序员应该拥有什么样的技能才能够独立完成项目?
不同的公司有不同的框架,怎么处理?
零散的知识点太多,很多又跟编程没有关系,该教,还是不该教?
技能是一个什么样的概念,是否真的能够结构化和量化?
每一个技能点怎么定义,业界里是否认可?
技能需要掌握的程度不一样,有的是了解,有的是必须深入学习,怎么区分?
带着这些问题,我们思考了很多,讨论了很多。最终的答案就是:
1 技能是可以整理归纳出来的。
2 不需要把所有同级的技能都学会,只需要掌握一种方式就可以。
3 业界的不认同,反而会是一个好事情,能够真正的去引发讨论。本身就是一个没有标准答案的东西,可以越来越精细。
4 通过不同技能的颜色,来标记需要掌握技能的等级。
所以我们整理出来了,PM,UI,Java,WEB,Android,IOS,OP七个职位我们认为最常用的技能。
这些技能点,就是零基础的学习者必须要掌握的技能。
而对于应该掌握的技能的等级,我们有一种截然不同的辨识方法。
受益于WOW的装备体系,我们同样划分了六个等级。与常见的了解,掌握等模糊不清的分级不同,我们划分体系的livedata源码标准仍然是:可验证。
灰色:从来没有听说过。
白色:项目里用到过,听说过,但是没有使用过。
绿色:经常在项目中使用过,但是不太了解原理。
蓝色:不但使用过,还了解内部的原理。但是没有做过改动和优化。
紫色:结合实际项目中的需要,对一些技能或者是组件或者是开源框架做过改进,更改过源码。
橙色:完全是自己开发的。
这样就很好的解决了初级工程师的技能等级问题。
附一个Java工程师的图例。
首页 | IT修真院 | 更快更高效的免费Java,CSS,JS,运维技术培训
懒得截图了,请直接访问。
五 学习路线
我们花了大量的时间去确认初级程序员的边界,即便是现在,也在缓慢的优化中。
为了避免争执的太多,并未邀请更多的人参与进来讨论。但是我们相信,在未来,他一定是一个可以公开编辑的技能体系。
是不是有了技能树,就可以给零基础的初学者指明方向了?
我们再来回顾一下,设计技能树的好处:
1.在知识的海洋中,自学的时候很容易迷惑,并不知道什么该学,什么不该学。
技能树完美的解决了这个问题。
2.在遇到一个问题被卡到的时候,确定不好是该自己跳过,还是应该彻底弄明白一个问题。
颜色代表的等级,在一定程度上对这个困惑有帮助。
3.究竟学到什么样的程度,才算是达到了公司的要求?
通过程序员的分级和技能树的边界,我们得出来了对大多数公司和大多数人都适用的目标,就算是略有偏差,也足以快速调整。
一个职业下需要掌握的技能有多少个?
~个。我没有仔细的统计,但是,确实是的。可能比这个还要多。
特别是关于技能的划分粒度。同样的为了避免争执太多,我们没有引入太多人加入讨论。
那么,superplayer 源码对于初学者来讲,还需要什么?
他们需要知道应该先学什么,再学什么的技能加点路线图。
是的。这其实就是技能树的来源。
首先技能是有分类的,其次技能是有先后顺序的。
所以我们通常把所有的技能分成组。
从易到难,组对应个不同的小阶段。
这样,对于初学者来说,就可以延着这个小任务,像上台阶,又像修行一样,可以有一个明确的学习规划了。
同样的,我们在分组的时候花了很多心思。
六 任务选取自真实项目VS根据任务设计题目
这是其中的争论之一。
是否应该为这些技能,单独设计任务?
还是应该收敛于我们的起点,所有的技能要求都来自于真实的实战项目?
我坚持实战的原则。
这代表着,不管理论上这个技能点多重要,只要在多数项目中看不到他们,就让他离开技能树的视线,最多加一个白色的标记。
这是一件更难的事情。所幸我们在过去的个月里,积累了将近个一线互联网项目,从金融到医疗到汽车,让我们有了足够多的素材可以选择。
这也完美的解释了为什么修真院的任务都是粒度比较大。
实际上,我们想做到的就是,从一开始,你就是一种另类的加入项目的方式。
你是菜鸡,就从项目里最 简单的事情做起。
你稍稍有了一点点能力,就去接触一下相对来讲比较难的东西。
大佬那么多,为什么不能是我 | 卡颂年终总结
我是一名前端开发工程师,一直在探索知识边界,提升自己。在年初由于疫情在家时,曾疑惑为何不是我成为大佬。但最终意识到,努力方向不对是关键。
为了职业发展,我将技术经理和前端架构师作为目标,意识到应更多地发展与前端相邻的工种,如产品、服务端,以提升业务整体把控能力。我也明白,提高知识深度,选择一个领域深度挖掘,可使自己成为行业内的专家,而不仅仅是“菜鸡”。所以,我决定以React框架开发作为努力的方向。
然而,我发现理解React框架的源码并不容易。它拥有全世界最优秀的前端开发者维护了7年的代码库,其中的众多方法对普通人来说是难以理解的。我投入了大量时间去理解React的设计理念、运行流程和源码细节。通过阅读相关的演讲内容、分享和出版了一本“先讲理念,再讲运行流程,再讲局部源码”的电子书——《React技术揭秘》。
在这本书的创作过程中,我发现有机会与许多知名库的作者、参与者、技术大拿、知识领域优秀的UP主、公众号主交流,并形成了一个拥有人的社群。这为我提供了一个与专业人士交流并学习的平台。
通过我的努力,我还与SegmentFault合作,制作了《自顶向下学 React 源码》的视频课程,该课程深受好评,让我成为了优秀的讲师。现在,当我面对React框架和其相关问题时,我可以说我已经掌握了其技术精髓,面对日常业务,可以说是“通关”。
最近,我还开始维护一款类似React框架——Anu.js,开始解决并修复bug,同时将React的一些试验特性搬运到这款框架中,如时间切片。此外,我在公众号上撰写文章,专注于React技术栈,提供针对React问题的源码层面解答。我的文章逐渐获得认可,也让我实现了“睡后收入”。
我的经历让我坚信,只要方向正确,努力便有意义。展望未来,我将保持动力,向着成为业界大佬的目标继续前进。感谢大家的支持与关注,让我们在年,共同朝着这个目标努力吧。
嵌入式学习路径之Linux|我说这是嵌入式全景图,你没意见吧?
欢迎关注嵌入式学习的朋友们,今天咱们聊聊Linux学习路径,如何从入门到精通。首先,让我们跳过繁琐的开场白,直击核心内容。
对于Linux的学习,我花费大量时间精心规划了一个详细的路径,适合不同阶段的学习者。请注意,这个路径设计旨在让你在至少年内都能持续受益。如果你现在无法投入分钟时间,可以先收藏,稍后再读,甚至可以边看边关注我,获取更多后续内容。
如果你已经熟悉了单片机的学习路径,那么你明白这里的“之Linux”意味着什么。嵌入式系统与PC机的区别在于定制化和专用性。Linux在嵌入式领域的应用,不仅仅是操作系统的使用,还包括硬件和软件的定制设计。
嵌入式设备通常没有键盘鼠标,而是根据特定功能选择相应的外设。Linux的学习分为四个阶段:小菜鸡、入门鸡、进阶机和老司机。小菜鸡阶段,你需要理解计算机基本概念,操作系统基础,程序编写和网络协议,同时掌握C语言基础。
入门鸡阶段,你需要提升C语言技巧,学习代码规范、数据结构、代码管理、系统编程和网络编程,以及使用第三方库。这个阶段的目标是系统编程和库的熟练应用。
进阶机阶段,分为通用内功和独门绝技。通用内功包括源代码学习、性能优化、代码移植性、多语言理解和Arm汇编,以及计算机体系结构知识。独门绝技包括图形界面编程、流媒体技术、人工智能、物联网和通信技术等。
最后是老司机阶段,关注技术、管理、行业和公司理解,如横向扩展技术、管理能力、行业深度认知以及产业链知识。这个阶段的目标是创新和业务领导力的提升。
记住,成为专家不是一蹴而就的,需要日积月累。无论你现在处于哪个阶段,持续学习、深入思考和实践是关键。未来的世界,物联网和人工智能将改变我们的生活,而你,就是这个变革的一部分。
现在,你可以开始你的嵌入式Linux之旅,让我们一起见证你的成长。如果你对嵌入式或物联网感兴趣,我整理的资源库里有更多精华内容等待你的探索。关注我,获取更多有价值的信息。
祝你学习顺利,期待下期再见!
STL 源码剖析:sort
我大抵是太闲了。
更好的阅读体验。
sort 作为最常用的 STL 之一,大多数人对于其了解仅限于快速排序。
听说其内部实现还包括插入排序和堆排序,于是很好奇,决定通过源代码一探究竟。
个人习惯使用 DEV-C++,不知道其他的编译器会不会有所不同,现阶段也不是很关心。
这个文章并不是析完之后的总结,而是边剖边写。不免有个人的猜测。而且由于本人英语极其差劲,大抵会犯一些憨憨错误。
源码部分sort
首先,在 Dev 中输入以下代码:
然后按住 ctrl,鼠标左键sort,就可以跳转到头文件 stl_algo.h,并可以看到这个:
注释、模板和函数参数不再解释,我们需要关注的是函数体。
但是,中间那一段没看懂……
点进去,是一堆看不懂的#define。
查了一下,感觉这东西不是我这个菜鸡能掌握的。
有兴趣的 戳这里。
那么接下来,就应该去到函数__sort 来一探究竟了。
__sort
通过同样的方法,继续在stl_algo.h 里找到 __sort 的源代码。
同样,只看函数体部分。
一般来说,sort(a,a+n) 是对于区间 [公式] 进行排序,所以排序的前提是 __first != __last。
如果能排序,那么通过两种方式:
一部分一部分的看。
__introsort_loop
最上边注释的翻译:这是排序例程的帮助程序函数。
在传参时,除了首尾迭代器和排序方式,还传了一个std::__lg(__last - __first) * 2,对应 __depth_limit。
while 表示,当区间长度太小时,不进行排序。
_S_threshold 是一个由 enum 定义的数,好像是叫枚举类型。
当__depth_limit 为 [公式] 时,也就是迭代次数较多时,不使用 __introsort_loop,而是使用 __partial_sort(部分排序)。
然后通过__unguarded_partition_pivot,得到一个奇怪的位置(这个函数的翻译是无防护分区枢轴)。
然后递归处理这个奇怪的位置到末位置,再更新末位置,继续循环。
鉴于本人比较好奇无防护分区枢轴是什么,于是先看的__unguarded_partition_pivot。
__unguarded_partition_pivot
首先,找到了中间点。
然后__move_median_to_first(把中间的数移到第一位)。
最后返回__unguarded_partition。
__move_median_to_first
这里的中间数,并不是数列的中间数,而是三个迭代器的中间值。
这三个迭代器分别指向:第二个数,中间的数,最后一个数。
至于为什么取中间的数,暂时还不是很清楚。
`__unguarded_partition`
传参传来的序列第二位到最后。
看着看着,我好像悟了。
这里应该就是实现快速排序的部分。
上边的__move_median_to_first 是为了防止特殊数据卡 [公式] 。经过移动的话,第一个位置就不会是最小值,放在左半序列的数也就不会为 [公式] 。
这样的话,__unguarded_partition 就是快排的主体。
那么,接下来该去看部分排序了。
__partial_sort
这里浅显的理解为堆排序,至于具体实现,在stl_heap.h 里,不属于我们的讨论范围。
(绝对不是因为我懒。)
这样的话,__introsort_loop 就结束了。下一步就要回到 __sort。
__final_insertion_sort
其中某常量为enum { _S_threshold = };。
其中实现的函数有两个:
__insertion_sort
其中的__comp 依然按照默认排序方式 < 来理解。
_GLIBCXX_MOVE_BACKWARD3
进入到_GLIBCXX_MOVE_BACKWARD3,是一个神奇的 #define:
其上就是move_backward:
上边的注释翻译为:
__unguarded_linear_insert
翻译为“无防护线性插入”,应该是指直接插入吧。
当__last 的值比前边元素的值小的时候,就一直进行交换,最后把 __last 放到对应的位置。
__unguarded_insertion_sort
就是直接对区间的每个元素进行插入。
总结
到这里,sort 的源代码就剖完了(除了堆的那部分)。
虽然没怎么看懂,但也理解了,sort 的源码是在快排的基础上,通过堆排序和插入排序来维护时间复杂度的稳定,不至于退化为 [公式] 。
鬼知道我写这么多是为了干嘛……