算法工程师是程序员吗如何学好算法

您现在的位置是: &
浅谈算法学习
摘 要:孙旭东先生是2007年算法擂台最优秀奖获得者,我们约请他谈谈学习算法的体会,希望对关注这个栏目的朋友有所帮助。
特别说明:本文献摘要信息,由维普资讯网提供,本站只提供索引,不对该文献的全文内容负责,不提供免费的全文下载服务。
金月芽期刊网 2017酷勤网 C 程序员的那点事!
当前位置: >
> 文章列表
10年学到的编程经验总结
我作为一个web开发者的旅程始于2000年,那时我还只有21岁,我依然可以清楚地记得那些日子里激荡在我内心的感觉。如果一定要找一个词来形容的话,我觉得那是愉悦。 我不需要担忧时间、最后期限和轻重缓急,也不需要担心生产力。我所要关心的只有一件事,那就...
时间: 21:31
来源: 码农网
成为聪明程序员必知的5个技能
软件开发人员在任何项目的架构和设计上起着非常关键的作用。当前的现代化架构世界需要现代化或聪明的开发人员,这些开发人员装备了各种务实的技能。了然于心,社会化以及聪明是这个世界所期待的开发人员。 那么,我们该如何定义聪明的开发者呢?有这样5个关...
时间: 19:46
来源: 码农网
12年程序员职业生涯得到的12个经验教训
我已经在ThoughtWorks工作了12年。是不是有点不可思议?回首我的职业生涯,我想写一写我在这些年中经历的困难,以及总结得到的12个非常重要的经验教训。虽然我只选择了12个,但其实远远不止这个数字,但是我觉得12年12个经验教训更有韵味。 1.工具不能代替思...
时间: 20:52
来源: 码农网
初级还是高级开发者,到底区别在哪里?
这听起来是一个很明显的问题,但是它真这么简单吗? 我听到过公司里的一些开发人员讨论这个问题。当时我的一位高级工程师正与两个初级工程师讨论一些其他的事情。当事情讨论完,其中一个初级工程师提出了这个问题,初级工程师还是高级工程师。 那个高级工程...
时间: 20:45
来源: 码农网
4个费劲心思却走向编程地狱的陷阱
优化你的代码、创建编程抽象、编写跨平台的应用程序,几乎所有遵守这些戒律的程序员不出意外都拿着一等票去往了一个没有休憩时间,项目总能准时完成,代码库永远不会过时,而且他们也不必写任何文档的天堂你懂的。 但是,要是情况不是这样的呢?要是那些技术...
时间: 20:44
来源: 码农网
如何成为一个成功的软件工程师
在这篇文章中,我们将讨论成为一个成功的软件工程师需要注意哪些要点,以便于鞭策自己也成为一个成功的软件工程师。 如何成为一个成功的软件工程师? 我发现Mr. Glenn Block提出的所有建议都非常有意义,并且我们每个人都应该好好学习。 不要害怕失败 我们是...
时间: 22:46
来源: 码农网
如何成为一名优秀的开发者?
作者: George Fekete George Fekete: Primal Skill的创始人和CTO,Primal Skill是一家罗马的web开发和咨询公司。George Fekete从事web开发,有着10年的客户端和服务端开发经验,主要是PHP和 JavaScript开发,并且从事过各种中型和大型的web应用程序建设。...
时间: 20:27
来源: CSDN博客
2016年你应该学习的语言和框架
2015年,软件开发界发生了很多变化。有很多流行的新语言发布了,也有很多重要的框架和工具发布了新版本。下面有一个我们觉得最重要的简短清单,同时也有我们觉得值得你在2016年花时间精力去学习的新事物的一些建议。 大趋势 在过去的几年里,有一个越来越明...
时间: 19:53
来源: 爱奇舞――H5.vc
程序员从优秀到伟大有多远
文/没故事的卓同学(简书作者) 原文链接:/p/83cc64470ec4 著作权归作者所有,转载请联系作者获得授权,并标注简书作者。 我没法全面的说明优秀和伟大间的区别,但是我知道有一些伟大程序员才有的特质: 能够在实用主义与完美主义间...
时间: 20:36
来源: 简书
如何从菜鸟成长为(伪)架构师
前些天,我在各种论坛里发招聘贴,遇见X君,前来问我道,你可曾为招聘贴写过什么软文吗?我说没有。他就正告我,那还是写一点罢;现在的招聘贴不写点鸡汤文是没有人转发的。 于是我思考许久,想起去年大约也是这个时候,写过一篇名为《如何从菜鸟程序员成长...
时间: 21:24
来源: Axb的自我修养程序员必须要会算法吗? | Hello world!小组 | 果壳网 科技有意思
129217人加入此小组
 程序员与算法本章的标题既然是“程序员与算法”,就必然要涉及一个基本问题,那就是“程序员是否必须会算法”。这是一个充满争议的问题,虽然并不像“生存还是毁灭”之类的选择那样艰难而沉重,但也绝不是一个轻松的话题。朋友们在我的“算法系列”博客专栏上发表的评论和回复,并不都是我所期待的赞美和鼓励,也常常会有一些冷言冷语。比如,“穷举也算是算法吗”或者“请你说明一下算法在XX系统中能起到什么作用”。有一次,一个网友通过邮件问我:“你写的都是小儿科的东西,几十行代码就能搞定,能不能整一点高深的算法?”我反问他什么是他所理解的高深的算法,他答复说:“像遗传算法、蚁群算法之类的。”于是我给了他一个遗传算法求解0-1背包问题的例子(参见第16章),并告诉他,这也就是几十行代码的算法,怎么理解成是高深的算法?他刚开始不承认这是遗传算法,直到我给了他Denis Cormier公开在北卡罗来纳州立大学服务器上的遗传算法的源代码后,他才相信他一直认为深不可测的遗传算法的原理原来是这么简单。还有一个网友直言我写的“用三个水桶等分8升水”之类的问题根本就称不上算法,他认为像“深蓝”那样的人工智能才算是算法。我告诉他计算机下棋的基本理论就是博弈树,或者再加一个专家系统。但是他认为博弈树也是很高深的算法,于是我给了他一个井字棋游戏(参见第23章),并告诉他,这就是博弈树搜索算法,非常智能,你绝对战胜不了它(因为井字棋游戏很简单,这个算法会把所有的状态都搜索完)。我相信他一定很震惊,因为这个算法也不超过100行代码。对于上面提到的例子,我觉得主要原因在于大家对算法的理解有差异,很多人对算法的理解太片面,很多人觉得只有名字里包含“XX算法”之类的东西才是算法。而我认为算法的本质是解决问题,只要是能解决问题的代码就是算法。在讨论程序员与算法这个问题之前,我们先探讨一个最基本的问题:什么是算法。1.1 什么是算法《算法导论》一书将算法(algorithm)描述为定义良好的计算过程,它取一个或一组值作为输入,并产生一个或一组值作为输出。Knuth在《计算机程序设计艺术》一书中将算法描述为从一个步骤开始,按照既定的顺序执行完所有的步骤,最终结束(得到结果)的一个过程。Weiss在《数据结构与算法分析》一书中将算法描述为一系列的计算步骤,将输入数据转换成输出的结果。虽然没有被普遍接受的“算法”的正式定义,但是各种著作中对算法的基本要素或基本特征的定义都是明确的,Knuth总结了算法的四大特征。确定性。算法的每个步骤都是明确的,对结果的预期也是确定的。有穷性。算法必须是由有限个步骤组成的过程,步骤的数量可能是几个,也可能是几百万个,但是必须有一个确定的结束条件。可行性。一般来说,我们期望算法最后得出的是正确的结果,这意味着算法中的每一个步骤都是可行的。只要有一个步骤不可行,算法就是失败的,或者不能被称为某种算法。输入和输出。算法总是要解决特定的问题,问题来源就是算法的输入,期望的结果就是算法的输出。没有输入的算法是没有意义的,没有输出的算法是没有用的。算法需要一定的数学基础,但是没有任何文献资料将算法限定于只解决数学问题。有些人将贪婪法、分治法、动态规划法、线性规划法、搜索和枚举(包括穷尽枚举)等方法理解为算法,其实这些只是设计算法常用的设计模式(Knuth称之为设计范式)。同样,计算机程序只是算法的一种存在形式,伪代码、流程图、各种符号和控制表格也是常见的算法展示形式。而顺序执行、并行执行(包括分布式计算)、递归方法和迭代方法则是常用的算法实现方法。综合以上分析和引述,本人将算法定义为:算法是为解决一个特定的问题而精心设计的一套数学模型以及在这套数学模型上的一系列操作步骤,这些操作步骤将问题描述的输入数据逐步处理、转换,并最后得到一个确定的结果。使用“精心设计”一词,是因为我将算法的设计过程理解为人类头脑中知识、经验激烈碰撞的过程,将算法理解为最终“小宇宙爆发”一般得到的智力结果。1.2 程序员必须要会算法吗很多人可能是好莱坞大片看多了,以为计算机神通广大,但事实不是这样的。计算机其实是一种很傻的工具,傻到几乎没有智商(至少目前是这样)。它可以连续几年做同一件事情而毫无怨言,但是如果你不告诉它怎么做,它什么事情也不会做。最有创造性的活动其实是由一种被称为“程序员”的人做的,计算机做的只不过是人类不愿意做的体力活而已。比如图像识别技术,需要一个字节一个字节地处理数据,提取数据的特征值,然后在海量的数据中比较、匹配这些特征值,直到累得两眼昏花,人类才不会干这种傻事儿呢。计算机愿意做,但前提是你要告诉它怎么做。算法可以理解为这样一种技术,它将告诉计算机怎么做。有人将编程理解为搭积木,直接用别人开发好的组件、库,甚至是类或API就行了,并且美其名曰“不用重复发明轮子”。我认为这其实就是所谓的系统集成,如果一个程序员每天的工作就是搭积木,那将是令人十分羡慕的事情,但是我知道,事实并不是这样的。这样搭积木式的编程计算机就可以做,没有必要让人来做,因为人工的成本高于计算机。我遇到的更多的是在论坛里发帖求助的人,比如“求代码,把一个固定格式的文本文件读入内存”,再比如“谁能帮我把这个结构数组排排序啊,书上的例子都是整数数组排序”。他们是如此地无助,如果不是论坛对回帖有积分奖励的话,恐怕不会有人理他们。我要说的是,大多数程序员并不需要知道各种专业领域里的算法,但是你要会设计能够解决你面临问题的算法。一些领域内的经典问题,在前人的努力之下都有了高效的算法实现,本书的很多章节都介绍了这样的算法,比如稳定匹配问题、A*算法等。但是更多情况下,你所面临的问题并没有现成的算法实现,需要程序员具有创新的精神。算法设计需要具备很好的数学基础,但数学并不是唯一需要的知识,计算机技术的一些基础学科(比如数据结构)也是必需的知识,有人说:程序=算法+数据结构,这个虽然不完全正确,但是提到了计算机程序最重要的两点,那就是算法和数据结构。算法和数据结构永远是紧密联系在一起的,算法可以理解为解决问题的思想,这是程序中最具有创造性的部分,也是一个程序有别于另一个程序的关键点,而数据结构就是这种思想的载体。再次重申一遍,我和大多数人一样,并不是要求每个程序员都精通各种算法。大多数程序员可能在整个职业生涯中都不会遇到像ACM(Association for Computing Machinery)组织的国际大学生程序设计竞赛中的问题,但是说用不到数据结构和算法则是不可想象的。说数据结构和算法没用的人是因为他们用不到,用不到的原因是他们想不到,而想不到的原因是他们不会。请息怒,我不是要打击任何人,很多情况下确实是因为不会,所以才用不到,下面就是一个典型的例子。1.2.1 一个队列引发的惨案我所在的团队负责一款光接入网产品的“EPON业务管理模块”的开发和维护工作,这是电信级的网络设备,因此对各方面性能的要求都非常高。有一天,一个负责集成测试的小伙儿跑过来对我说,今天的每日构造版本出现异常,所有线卡(承载数据业务的板卡)的上线时间比昨天的版本慢了4分钟左右。我很惊讶,对于一个电信级网络设备来说,每次加电后的线卡上线时间就是业务恢复时间,业务恢复时间这么慢是不能接受的。于是我检查了一下前一天的代码入库记录,很快就找到了问题所在。原来当前版本的任务列表中有这样一项功能,那就是记录线卡的数据变更日志,需求的描述是在线卡上维护一个日志缓冲区,每当有用户操作造成数据变更时,就记录一条变更信息,线卡上线时的批量数据同步也属于操作数据变更,也要计入日志。因为是嵌入式设备,线卡上日志缓冲区的大小受限制,最多只能存储1000条记录,当记录的日志超过1000条时,新增的日志记录将覆盖旧的记录,也就是说,这个日志缓冲区只保留最近写入的1000条记录。一个新来的小伙儿接受了这个任务,并在前一天下班前将代码签入库中(程序员要记住啊,一定不要在临下班前签入代码)。他的实现方案大致是这样的(注释是我加上的):#define SYNC_LOG_CNT
#define SYNC_LOG_MEMOVER_CNT
typedef struct
INT32U logC
EPON_SYNC_LOG_DATA syncLogs[SYNC_LOG_CNT];
}EPON_SYNC_LOG;
EPON_SYNC_LOG s_EponSyncL
void Epon_Sync_Log_Add(EPON_SYNC_LOG_DATA*pLogData)
INT32U i = 0;
INT32U syncLogCnt = 0;
syncLogCnt = s_EponSyncLog.logC
if(syncLogCnt&=SYNC_LOG_CNT)
/*缓冲区已满,向前移动950条记录,为新纪录腾出50条记录的空间*/
memmove(s_EponSyncLog.syncLogs,
s_EponSyncLog.syncLogs + SYNC_LOG_MEMOVER_CNT,
(SYNC_LOG_CNT-SYNC_LOG_MEMOVER_CNT) * sizeof(EPON_SYNC_LOG_DATA));
/*清空新腾出来的空间*/
memset(s_EponSyncLog.syncLogs + (SYNC_LOG_CNT - SYNC_LOG_MEMOVER_CNT),
0, SYNC_LOG_MEMOVER_CNT * sizeof(EPON_SYNC_LOG_DATA));
/*写入当前一条日志*/
memmove(s_EponSyncLog.syncLogs + (SYNC_LOG_CNT - SYNC_LOG_MEMOVER_CNT),
pLogData, sizeof(EPON_SYNC_LOG_DATA));
s_EponSyncLog.logCnt = SYNC_LOG_CNT - SYNC_LOG_MEMOVER_CNT + 1;
/*如果缓冲区有空间,则直接写入当前一条记录*/
memmove(s_EponSyncLog.syncLogs + syncLogCnt,
pLogData, sizeof(EPON_SYNC_LOG_DATA));
s_EponSyncLog.logCnt++;
}这个方案使用一个长度为1000条记录的数组存储日志,用一个计数器记录当前写入的有效日志条数,数据结构的设计中规中矩,但是当缓冲区满,需要覆盖旧记录时遇到了麻烦,因为每次都要移动数组中的前999条记录,才能为新记录腾出空间,这将使Epon_Sync_Log_Add()函数的性能急剧恶化。考虑到这一点,小伙儿为他的方案设计了一个阈值,就是SYNC_LOG_MEMOVER_CNT常量定义的50。当缓冲区满的时候,就一次性向前移动950条记录,腾出50条记录的空间,避免了每新增一条记录就要移动全部数据的情况。可见这个小伙儿还是动了一番脑子的,在Epon_Sync_Log_Add()函数调用不是很频繁的情况下,在功能和性能之间做了个折中,根据自测的情况,他觉得还可以,于是就在下班前匆匆签入代码,没有来得及安排代码走查和同行评审。但是他没有考虑到线卡上线时需要批量同步数据的情况,在这种情况下,Epon_Sync_Log_Add()函数被调用的频度仍然超出了这个阈值所能容忍的程度。通过对任务的性能进行分析,我们发现大量的时间都花费在Epon_Sync_Log_Add()函数中移动记录的操作上,即便是设计了阈值SYNC_LOG_MEMOVER_CNT,性能依然很差。其实,类似这样的固定长度缓冲区的读写,环形队列通常是最好的选择。下面我们来看一下环形队列的示意图,如图1-1所示。图 1-1 环形队列示意图计算机内存中没有环形结构,因此环形队列都是用线性表来实现的,当数据指针到达线性表的尾部时,就将它转到0位置重新开始。实际编程的时候,也不需要每次都判断数据指针是否到达线性表的尾部,通常用取模运算对此做一致性处理。设模拟环形队列的线性表的长度是N,队头指针为head,队尾指针为tail,则每增加一条记录,就可用以下方法计算新的队尾指针:tail = (tail + 1) % N 对于本例的功能需求,当tail + 1等于head的时候,说明队列已满,此时只需将head指针向前移动一位,就可以在tail位置写入新的记录。使用环形队列,可以避免移动记录操作,本节开始时提到的性能问题就迎刃而解了。在这里,套用一句广告词:“没有做不到,只有想不到。”看看,我没说错吧?本文摘自
+ 加入我的果篮
我去原来是广告......
(C)2017果壳网&&&&京ICP证100430号&&&&京网文[-239号&&&&新出发京零字东150005号&&&&
违法和不良信息举报邮箱:&&&&举报电话:点击阅读原文
程序员的自我修养:我写代码这三年
6月15日 发布,来源:
。谨以此文,纪念我过去三年的技术之路,感谢陪伴我这三年的家人,感谢所有陪我一起打拼过的战友,感谢所有阅读过我文章的陌生人。
程序员的自我修养:我写代码这三年
三年里最忙的时候需要兼顾两个公司的团队,还有论文和自己待出版的书,最多的时候直接负责过二十多人的技术团队。不过从写博客以后虽然也是断断续续,但总算坚持了下来。一年多里写了两百多篇博文,各渠道总阅读量超两百万(估算)。我的成绩不值一提,我唯一觉得让我骄傲的是我比三年前的自己会更加成熟与稳健,做成了一些我希望自己去做的事情。感谢批判我的人让我及时发现自己的不足与失误,校准方向;感谢支持我的人给我不断前行的动力。三年里陪着爱人走过几个国家,看过一些风景,
在对待所谓成功与经验的态度上,我是蛮欣赏勃学的态度,认清自己的同时不去盲目崇拜,不以物喜,不以己悲,知前路之漫漫,能披荆而斩棘。笔者在回顾自我的道路时,我觉得最大的特点会是可行的,当然也是因为我尚在起点左近吧。我没有天赋过人,当年七个月早产出生,差一点就不能跟这个世界说你好。从小略显愚笨,弱于常人,就像笔者对于数学心有畏惧,这么些年一直没学好算法结构与机器学习。笔者也没有过人的毅力与执着的态度,到现在也没能真正的好好锻炼过,也没能如预期般学完一个课程或者看完一本书。更多的时候我是想着怎么跟自己妥协,寻找到真正能够完成的,精神与肉体上都能接受的方案。
贯穿笔者整个系列的方法论,概括而来就是王阳明的知行合一,心学博大精深,我也是以自己的方式与实践尝试去理解。知行合一最简单粗暴的理解就是认知与实践的相统一,不过借用韩寒的一句话,读过很多道理,却仍然过不好这一生。现代社会我们每天或多或少的都会被灌入一些鸡汤,但是那些明明很有道理的道理却是如此的难于贯彻。我自身的自制力本就不强,因此更多的思考会立足于可行性,不过做太多超乎我执行力之外的规划,梦想总是要有的,但尽可能的让它能够实现。我看来的知行合一,也是分为两个方面,一是以更高层次的知驱动正确的行,这就是下文会提及的以高于自己当前层次的知识体系让自己更有效地学习与积累。另一个是以可以实现的行去驱动自己的认知衍化,这里的行主要就是阅读与实践,而这里的认知衍化绝不是简单的了解某个概念、名词,而是能够将知识填充到前者所谓的知识体系中,并不断地扩充、完善这个知识体系。
笔者这些年来一直笔耕不缀,不过写的绝大部分都是属于某个领域中某个技术细节的介绍与实践总结,借这篇随笔之际,笔者也是打算以随笔的方式,描述自己对于编程的认知、感悟、猜想,因为这个系列更多的是非技术性的思考,希望能得到真正的大家指导,与其他人思维碰撞。笔者不敢取名为程序员的自我修养,毕竟笔者自己都不知道自己是否称得上合格的程序员,因此取名为程序熊的自我修养。【程序熊的自我修养】系列拟会包含以下部分:
【程序熊的自我修养】知识体系与自我定位
【程序熊的自我修养】阅读与积累
【程序熊的自我修养】工具与实战
【程序熊的自我修养】产品与工程化
【程序熊的自我修养】编程之道:编程语言、数据结构与算法、编程范式
【程序熊的自我修养】Web 前端
【程序熊的自我修养】服务端应用程序架构
【程序熊的自我修养】数据科学与人工智能
,中文翻译。
高屋建瓴的技术知识体系
这是一个知识爆炸的年代,我们面对的矛盾不再是无处学习,而是学习的速度跟不上新知识产生的速度,这个时代已经容不得我们过于缓慢。在物理学科中放射性元素有所谓半衰期的概念,即某种特定物质的浓度经过某种反应降低到剩下初始时一半所消耗的时间。
Stay Hungry,Avoid Foolish
睁眼看世界。心有多大,世界就有多大。井底之蛙
笔者不喜欢别人称呼大牛或者类似的头衔,在我看到的世界里不过是刚刚上路的初学者,尚有山高水长,千难万险,若现在就称大牛,真是汗颜。
知识的半衰期
化学中的放射性元素往往有所谓半衰期的概念,即某种特定物质的浓度经过某种反应降低到剩下初始时一半所消耗的时间。而知识的半衰期则是用于衡量知识的价值随着时间流逝它消失的速度。相对变更较慢的医学知识的半衰期约45年,物理学知识的半衰期是10年,而计算机知识的半衰期可能只有两年,一直在激烈变化的互联网领域知识可能只有几个月。
从系统化学习到碎片化学习、从阶段性学习到终身学习、从专业学习到通才学习。孔子曰,三人行,必有我师焉。
技术中所谓的术道之分,本文提及的《人类简史》与《未来简史》,都是文学家编著的,但是其中提及的人类社会的衍化都是基于人工智能、大数据、云计算这些很技术的名词。
术业有专攻,专才能有,通才难得。
从指向性学习到跨界式学习
从小学到大学的学习模式,所有的课程都是提前设置和规划好的,是一种序列式的指向性学习。而大学毕业以后,其实就进入了自我教育的阶段,因为工作的原因,我们不得不进行跳跃式学习。这个时候学习知识就不能太具有指向性,也就是一个知识只用来解决一个问题,而是要对知识进行跨界的迁移。回顾下我们的程序员的知识,我是在大学里开始学习计算机知识的,学习的操作系统原理,算法和数据结构等这类知识的半衰期也是比较长的,也是我们后面的跨界式学习的基础,所以在大学里学习一定要打好基础,可惜现今的大学已经变成了简单的培训机构.毕业后我的第一份工作是系统集成工作,打交道的是网络,交换机,操作系统,也是在那时的工作中结识了Linux,从此就爱上了Linux,不过大学专业学的计算数学,个人感觉还是搞软件更有未来,所以在那个网络很好赚钱的2000年我开始学习软件开发,用过C++、Powerbuilder,看过微软推出的C# 最顺眼,而且当时大名鼎鼎的米格尔正在搞开源项目Mono,我就跟着米格尔开始进入.NET开发,开发的大部分.NET应用都跑在Windows上,也有一部分跑在Linux上,到了今天,微软也爱上了Linux,今后我开发的.NET应用都会跑在Linux上,这个过程中我在.NET社区推广Mono,现在推广.NET core,逐渐的从非主流变成主流。
从整体化学习到碎片化学习
所谓碎片化,是一个相对概念。比如你敢一天不刷朋友圈,第二天上班同事聊天,就能一句让你插不上话,一天不看手机就会感觉整个世界都变了。另外碎片化除了占用学习时间短以外,还要能保证学习的随时随地,比如蹲厕所、等公交、开车时都可以进行学习,也就是可以满足多场景。知识的更新迭代实在是太快了,整体化学习越来越不适应市场竞争,碎片化学习的时代已经到来。所以,未来基于互联网的语音分享和视频直播,会慢慢成为人们主要的学习方式。大学里还有机会去系统的学习,工作了大部分时间被加班占据,我们的时间已经变成了碎片,每天能够抽出30分钟出来学习,研究新技术,日积月累,几年后就和抽不出时间的人拉开差距,这就可以很好的解释很多人工作时间越长越没有竞争力了,这么多年的时间里都没有进行学习,知识的半衰期又是这么短,经常在社区听到有人在抱怨微软的技术更新太快,“vs2017出来了,我还在用vs2005”等等的论调,问题出在自身,而不反思。希望大家能够抽些时间学习最新的.NET Core,Linux的知识。
从阶段性学习到终身式学习
时间会消磨一切的价值,随着时代的演进,技术被再次突破,审美被迭代,甚至使用的场景也发生了根本性的变化,一劳永逸的学习方式一去不复返了。我们这代人,注定一生花在学习上的时间比真正花在实践上的时间多。因为终身式学习来了。现在已经进入到云计算时代,软件架构也要从单体过渡到微服务,.NET Core就是为了适应微服务而对.NET 进行重构,以前你构建软件的那些知识已经衰减了,需要补充新知识了,我通过运营公众号,每天推送几篇文章,很多文章都是新知识,这也是一个学习的过程,我希望通过公众号让更多的人和我一样终身学习,目前公众号有25000粉丝,每天文章阅读量却只有8000,很多人关注了,并没有看过的文章,其实我推送的每篇文章都是有所考虑的,但是公众号是个单向的交流,里面的交流基本没有,我创建了一个付费的小密圈想把真正一起学习的同伴识别出来,可以一起交流。
记忆宫殿:有效地碎片化学习
Learn Everywhere, Anytime.
在如今这个知识爆炸的时代,限制我们学习的不再是知识的来源,而是我们自身的学习能力与学习方式。不可否认不同人的能力是不一致的,我们也不能奢望自己能够勤奋到囊萤映雪、凿壁偷光。不仅是大部分人的努力程度之低尚谈不上比拼天赋,而且我们几乎很少能达到自己的既定目标。对于很多工作的人而言,可能只能利用晚上或者周末时间进行学习,即使制定了详细的计划往往也会因为家庭或工作的突发事件而无疾而终。这种现实的无奈是很难以人为意志为转移,因此在无法像学校那时的完全的系统化的学习。在初级阶段,我们势必是要进行碎片化学习的,这总比不学习来得好。
笔者非常支持认可碎片化学习的思想,但是否定在没有知识体系的情况下盲目的碎片化学习。特别是对于尚未建立基础知识体系与认知能力的同学,如果突发性地吸收过多的知识,反而会摧毁自己的认知能力。就好像传说中的吸星大法,乱吸的后果就是体内真气斑驳不堪,最终走火入魔,爆体而亡。另外,。在没有知识体系的情况下,学习的知识都是相互独立,难以互相借鉴,举一反三,阅读也不过是春风拂面,一掠而过,不留痕迹,知识也就难以真正的沉淀下来。
从笔者自己的经历而言,最初的阅读,这个阶段非常的痛苦。
在碎片化学习的过程中,我们不仅要感受到每日阅读、学习的东西,还要能够感受这些知识真正的聚沙成塔、集腋成裘,成为了你的知识体系中不可分割的一部分。
知我不知,穿越未来
I Know What I Dont Know
梭罗在《瓦尔登湖》中写道:知道自己知道什么,也知道自己不知道什么,这就是真正的知识。知我所知是对于自己能力的正确认识,知我所不知则能为自己未来的路明确些方向。
我们不能让已有的知识,已有的技术,已有的成就,已有的地位成为阻碍。
知识在它该在的地方
Code Complete》里面强调的"programming into a language rather than programming in a language"原则, 即我们应该把编程的通用原则和规范应用到具体编程语言中,而不是受某门编程语言的限制而忽略了编程的通用原则。
笔记与博客:知识的积淀
阳明先生朝思夕计,终于领悟了格物致知,知行合一的道理,也是他面对这个世界的方法论,从此为天地立心,为生民立命,为往圣继绝学,为万世开太平。前文所讲我们竭力地去为自己开拓
生命存在的痕迹
笔者最初做笔记的时候,很多朋友会质疑,记录的笔记真的会去看吗?是不是记录之后就能记住了?答案自然是否定的,笔者一直以来鼓励自己做笔记的动力并不是让自己不会遗忘,而是希望在下一次需要的时候能够以最快的速度学习让自己回忆起之前的东西。笔者发现身边很多人的学习能力并不弱,但是技术能力难以进步突破的问题却是在于永远都在重复学习,譬如笔者团队中秉持岗位轮换的原则,可能做几个月的服务端再轮换做一些简单的前端,但是每次都需要重新学习,看不出什么进步。
罗曼罗兰说过,多数人二十或三十多岁已经死了,他们变成自己的影子,不断重复以前的自己。
打造个人品牌
在带领团队的时候我一直会思考,应该如何激励他人,常用的方式包括责任心、对于技术的追求以及物质的刺激。物质的刺激是笔者最不想用的,人的欲望是无穷的,物质的刺激作为额外的辅助,但是一直作为主要的刺激手段不免终有黔驴技穷的一天。回到本部分的主题,笔者在这几年里一直建议敦促身边的朋友们尝试着写写文章,不过能坚持下来的寥寥,更多的则是三分钟热度。估计很多阅读本文的读者也逃脱不了这个问题,因为繁忙的工作、因为总是觉得尚未准备好,一而再再而三的推迟文章的计划。最终在那一天蓦然回首,当初的梦想终归是梦想。
因此在这里,笔者想特别陈述下文章与博客对于个人发展的重要价值。
我们很多人想着去赚钱,但其实应该让自己先值钱,才能去赚钱。
Read Everywhere, Learn Anytime.
Read It When You Need It
辩证式阅读
尽信书,则不如无书,不过这并不是不去读书的理由。
王安石天命不足畏,祖宗不足法,人言不足恤。笔者看完今年的时间的朋友跨年演讲之后,特地看了下评论中与知乎上反驳的内容,从不同的视角、不同的立场进行考虑,实在是有趣。
每日阅读清单
认识你自己
对于所谓成功者或是所谓天才,爱因斯坦说过,天才是百分之一的灵感,百分之九十九的汗水;但那1%的灵感是最重要的,甚至比那99%的汗水都要重要。
笔者并不敢随便置喙这个千古谜题,不过从笔者个人的成长经历而言,既然机器都可以通过大量的数据而不是算法的革新来提升自己的认知能力,那么人类在大量的训练、见过了很多的风景之后缘何不会得到提升呢?天地不仁,万物刍狗,在这样一个崇尚个人自由的年代,笔者相信只要奋斗就能提升自己成才的概率。苏格拉底有句名言叫认识你自己,而实际上以我们现有的认知能力很难去勾画出未来的自己,就好像你永远不知道未来的自己有多强大。入无法家拂士,出无敌国外患者,国恒亡,人也是这样,安逸的环境会掘下梦想的坟墓,本部分也是希望先描述笔者对于未来的担忧,来思考应该给予自己未来怎样的定位,才不会被这个时代所抛弃。
对于笔者而言,我认识到自己的天赋普通,也没有傲人的背景,接受的也是一般的教育与平凡的经历。笔者不会奢求完成某些小目标,但是既然外在的力量能够通过细致的分析去发现你自己,那么我们是否能通过换位的分析来更加地了解自己呢?
未来幸存者
2016 年的年末,笔者莫名有些恐慌的情绪,一部分来自于学业与工作的压力,另一部分却是来自于对于未来的未知的恐惧。笔者目前所在的公司是负责政府相关的一些技术服务,这个行业很明显感觉整体的技术水平与外部相差很多,就好像井底之蛙,被厚厚的壁垒与外部的江河隔开,仅看到那一方小小的天地。年会上做年度总结的时候,看着下面坐着的,跟了我三四年的那些年轻的面孔,处于对他们的责任感我很担心哪一天这个壁垒被打破之后,他们会陷入所谓的中年危机。另一方面,笔者自己在南大就读的也是人工智能与数据挖掘相关,虽然是个门外汉但看着大潮浩荡而来,许多曾经的巅峰被征服,笔者不免担心会不会未来就是巨头的天下?。这一轮人工智能深度学习的浪潮可能难再现当年互联网浪潮下千帆竞渡的盛景,也就意味着不会有那么多面向我们这些一无所有的年轻人的机会。后来听了吴恩达等大牛的演讲认识到端到端的学习尚未主导,心中不免送了一口气,又杞人忧天了一回。
未来简史中分析二十一世纪会存在三种人:无用的人、没有自主的人与神人。工业革命是发挥人的生产力,而智能革命则是替代人,虽然笔者认为现阶段的人工智能的目标是辅助人工智能,但是依然会在未来取代很多行业的职位,并且这些辅助性的人工智能会比你自己更了解自己,也更能影响你自己。如果有一天我们真的成为了电影里每日衣食无忧,不用烦恼的神人,那么和过去城隍庙里被人供奉,每日享受些香火的泥塑菩萨又有什么区别?
正如赫拉利所说,笔者思考这些不是希冀去预测未来,而是想把自己从过去解放出来,敢于去想象不同的命运。不求流芳百世,不愿遗臭万年,只希望生如夏花,总有那么绽放的岁月。笔者希望自己能做有价值的人,对家人、对朋友、对社会有价值的人;活在未来,不是不死,而是不会被这个时代所抛弃。
独立而可变的意识
从人类简史到未来简史,赫拉利都强调基于意识的虚构的力量带给人们所谓的互联主观(Intersubjectivity),让人群能够实现大规模的灵活高效的组织合作,而真正区别于动物。人皆有意识,但不知意识为何物,而科学家能够给出最好的对于意识的解读却是人根本不需要意识。如果我们把人类比于计算机,那么神经信号的传递能够解释人一系列的本能反应,而意识更像额外的副产品,或者称为精神污染(此处参考了未来简史,认知具有争议)。现代社会我们高举自由主义的大旗强调独立个体的自由意志,不过随着大数据时代的到来人们惊讶的发现似乎身边的机器更懂自己,做出的选择更符合未来自己的期望,那么自然而然也就会倾向于将思考的过程交于机器,自己只是听命于结果。笔者在上文中也提及我们需要带着辩证的态度去阅读,中学就学过的马克思主义辩证法会是贯穿一生的有效的方法论。
就独立而可变的意识而言,这方面可能女人走在了男人的前面,毕竟男人穷尽一生也读不懂一个女人。
我是程序员
程序员的自我革命
很浮躁,很多关于技术的讨论不再关注技术本身,而是要么互相吹捧,要么人身攻击。我个人很不喜欢所谓的师徒这种关系。
程序员的使命就是自我革命
所谓更牛,就是换个罪受,我们一生都在处于不断地向上,在资讯爆炸外部资源极大丰富的年代,更大的瓶颈还是在我们自己。
他山之石,求同存异
君子慎独,不欺暗室,何况于网络乎?现在网络上的戾气越来越大了
道不同,不相为谋。
相看两不厌,唯有敬亭山。
渡尽劫波兄弟在,相逢一笑泯恩仇。
不想当将军的士兵不是好士兵
技术与管理二者互不冲突,笔者不太提倡单纯的炫技,我们对于技术的追求本质上还是为了构建更好的产品,而伟大的产品需要伟大的团队作为支撑,当年求伯君单枪匹马睥睨天下的时代已是明日黄花。笔者经常会思考,我的价值在哪里?实际上,而是所谓格局。格局是一个很抽象的词汇,有的人写代码的时候看到的是眼前的代码,有的人看到的是一个模块,有的人看到的是一个产品,有的人则看到的是在使用着产品的用户场景。
软件架构(software architecture)是一系列相关的抽象模式,用于指导大型软件系统各个方面的设计。传统软件架构描述的对象是直接构成系统的抽象组件,侧重于系统的抽象、拆分、组织方式等。
定位在未来
我至今为止没有在大公司实习或者工作过
君子有责,当仁不让
老人常说,吃亏是福。
火影里鸣人穷其一生是为了获得认同,虽然有很多的羁绊,但是一生是有意义的。德国社会学家马克斯韦伯说过,人是悬挂在自己编织的意义之网上的动物。
在西欧的一些高福利国家,譬如德国,很多穷人选择主动失业以获取高福利。我们工作的目标不仅仅是为了获取
德国的穷人失去了自制力,变得不守时,变得懒惰与放纵。
我们体面着装不是炫耀的工具,而是约束自己的工具。我们以为追求生活的美好而自律,因为自律而达成体面。
我在路上,仰望星空。
2013年10月我拿到了南大的保研资格,2014年11月我开始了第一次创业,约球吧。不出三月失败而终,幸好有朋友接手,开始了LiveForest与南京运之林。一年创业之后,开始尝试转型,这个阶段参与过在线婚庆的创业,参与了3D打印行业的创业。自己本身在南大参与的也是机器学习相关。
就像罗振宇在跨年演讲中提及的,狗真的会是最后的胜利者吗?
如果时光倒流
悲悲戚戚,如丧考妣
本文最后,笔者还是想对于所有阅读过我的文章的朋友说声谢谢,你们的支持是我前行的动力,希望在未来的岁月里我能够继续完善我的知识体系中的内容,也希望能够帮助到所有花时间阅读我文章的人。未来的世界是时间的战场,愿意花时间阅读的朋友本身也是一种付出。
干了这碗鸡汤
明天提醒我
我要该,理由是:
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
扫扫下载 App}

我要回帖

更多关于 算法工程师是程序员吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信