⑴ 程序员的核心竞争力是什么为什么
终于有一个问题可以好好说说我遇到过的弯路了。我认为程序员的核心竞争力如下:1. 整合现有资源的能力,什么时候造轮子,什么时候不造轮子,什么情况下利用公司自己的轮子,什么情况下利用开源的轮子。2. 产品发展方向的规划能力,一个技术类的框架,产品,平台,需要程序员明确什么问题是要解决的,什么问题是不要解决的,产品相对其他竞争产品的优势在哪些方面。3. debug能力,有了线上问题,可以一撸到底,无论问题在哪里,操作系统,文件系统,虚拟机,框架,等等,都可以定位问题所在。4. 文档、pr能力,作出了产品,可以迅速了解优势所在并推广5. 编码习惯,比如严谨的持续集成,测试样例先行,之所以说是习惯不是技巧,是因为好的编码习惯,可以持续为团队带来更大收益,而好的编码技巧没有那么大的效果。切忌以下行为:1. 长时间调研没结果,学习了很多框架,做法,无法认真对比优劣,这就是不能抓住核心的问题2. 被需求牵着鼻子走,失去了产品的规划方向,或是走到哪算到哪,做出来的东西因为臃肿的需求越做越繁琐3. 随口乱说release时间,总是失约
⑵ 为什么技术的深度比广度更重要呢
1.广度学习,尽可能多学相关的内容,了解主流技术以及粗略的原理;
2.深度学习,按一个点深挖到低层代码和设计模式;
3.优先广度,先找主流技术,感兴趣或应用广的先深挖;
4.优先深度,先找某个点,同一层次的去了解相关的实现;
广度优缺点:
1.优点:认知面广,对抽象理解更深刻;
2.缺点:掌握了很多“知道”,但是很少有可以转化为技术的;
深度优缺点:
1.优点:深刻理解程序员用技术改变世界,产品、测试、运维改变程序员;
2.缺点:缺乏大局观,像挖井工人,挖完一个挖下一个,总能挖到煤,但是不知道下次挖到煤需要多久。
其实没有谁更重要,这是个先后问题。
建议先广度,因为现实中不会有公司轻易就给你钱,而工作内容只是研究一个不一定有产出的技术点。广度优先的核心就是要能够做事,能够有产出,解决个人和部门、公司的经济问题,在经济不成问题,没有很大产出压力的情况下,仍建议广度优先,主要是为了明确方向和目标,确立了目标后,以目标为导向,该深的地方深,该广的地方广。
⑶ 程序员必须掌握哪些算法
一.基本算法:
枚举. (poj1753,poj2965)
贪心(poj1328,poj2109,poj2586)
递归和分治法.
递推.
构造法.(poj3295)
模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)
二.图算法:
图的深度优先遍历和广度优先遍历.
最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra)
(poj1860,poj3259,poj1062,poj2253,poj1125,poj2240)
最小生成树算法(prim,kruskal)
(poj1789,poj2485,poj1258,poj3026)
拓扑排序 (poj1094)
二分图的最大匹配 (匈牙利算法) (poj3041,poj3020)
最大流的增广路算法(KM算法). (poj1459,poj3436)
三.数据结构.
串 (poj1035,poj3080,poj1936)
排序(快排、归并排(与逆序数有关)、堆排) (poj2388,poj2299)
简单并查集的应用.
哈希表和二分查找等高效查找法(数的Hash,串的Hash)
(poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)
哈夫曼树(poj3253)
堆
trie树(静态建树、动态建树) (poj2513)
四.简单搜索
深度优先搜索 (poj2488,poj3083,poj3009,poj1321,poj2251)
广度优先搜索(poj3278,poj1426,poj3126,poj3087.poj3414)
简单搜索技巧和剪枝(poj2531,poj1416,poj2676,1129)
五.动态规划
背包问题. (poj1837,poj1276)
型如下表的简单DP(可参考lrj的书 page149):
E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533)
E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最长公共子序列) (poj3176,poj1080,poj1159)
C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最优二分检索树问题)
六.数学
组合数学:
1.加法原理和乘法原理.
2.排列组合.
3.递推关系.
(POJ3252,poj1850,poj1019,poj1942)
数论.
1.素数与整除问题
2.进制位.
3.同余模运算.
(poj2635, poj3292,poj1845,poj2115)
计算方法.
1.二分法求解单调函数相关知识.(poj3273,poj3258,poj1905,poj3122)
七.计算几何学.
几何公式.
叉积和点积的运用(如线段相交的判定,点到线段的距离等). (poj2031,poj1039)
多边型的简单算法(求面积)和相关判定(点在多边型内,多边型是否相交)
(poj1408,poj1584)
凸包. (poj2187,poj1113)
中级(校赛压轴及省赛中等难度):
一.基本算法:
C++的标准模版库的应用. (poj3096,poj3007)
较为复杂的模拟题的训练(poj3393,poj1472,poj3371,poj1027,poj2706)
二.图算法:
差分约束系统的建立和求解. (poj1201,poj2983)
最小费用最大流(poj2516,poj2516,poj2195)
双连通分量(poj2942)
强连通分支及其缩点.(poj2186)
图的割边和割点(poj3352)
最小割模型、网络流规约(poj3308)
三.数据结构.
线段树. (poj2528,poj2828,poj2777,poj2886,poj2750)
静态二叉检索树. (poj2482,poj2352)
树状树组(poj1195,poj3321)
RMQ. (poj3264,poj3368)
并查集的高级应用. (poj1703,2492)
KMP算法. (poj1961,poj2406)
四.搜索
最优化剪枝和可行性剪枝
搜索的技巧和优化 (poj3411,poj1724)
记忆化搜索(poj3373,poj1691)
五.动态规划
较为复杂的动态规划(如动态规划解特别的旅行商TSP问题等)
(poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj3034)
记录状态的动态规划. (POJ3254,poj2411,poj1185)
树型动态规划(poj2057,poj1947,poj2486,poj3140)
六.数学
组合数学:
1.容斥原理.
2.抽屉原理.
3.置换群与Polya定理(poj1286,poj2409,poj3270,poj1026).
4.递推关系和母函数.
数学.
1.高斯消元法(poj2947,poj1487, poj2065,poj1166,poj1222)
2.概率问题. (poj3071,poj3440)
3.GCD、扩展的欧几里德(中国剩余定理) (poj3101)
计算方法.
1.0/1分数规划. (poj2976)
2.三分法求解单峰(单谷)的极值.
3.矩阵法(poj3150,poj3422,poj3070)
4.迭代逼近(poj3301)
随机化算法(poj3318,poj2454)
杂题(poj1870,poj3296,poj3286,poj1095)
七.计算几何学.
坐标离散化.
扫描线算法(例如求矩形的面积和周长并,常和线段树或堆一起使用)
(poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)
多边形的内核(半平面交)(poj3130,poj3335)
几何工具的综合应用.(poj1819,poj1066,poj2043,poj3227,poj2165,poj3429)
高级(regional中等难度):
一.基本算法要求:
代码快速写成,精简但不失风格
(poj2525,poj1684,poj1421,poj1048,poj2050,poj3306)
保证正确性和高效性. poj3434
二.图算法:
度限制最小生成树和第K最短路. (poj1639)
最短路,最小生成树,二分图,最大流问题的相关理论(主要是模型建立和求解)
(poj3155, poj2112,poj1966,poj3281,poj1087,poj2289,poj3216,poj2446
最优比率生成树. (poj2728)
最小树形图(poj3164)
次小生成树.
无向图、有向图的最小环
三.数据结构.
trie图的建立和应用. (poj2778)
LCA和RMQ问题(LCA(最近公共祖先问题) 有离线算法(并查集+dfs) 和 在线算法(RMQ+dfs)).(poj1330)
双端队列和它的应用(维护一个单调的队列,常常在动态规划中起到优化状态转移的目的). (poj2823)
左偏树(可合并堆).
后缀树(非常有用的数据结构,也是赛区考题的热点).(poj3415,poj3294)
四.搜索
较麻烦的搜索题目训练(poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)
广搜的状态优化:利用M进制数存储状态、转化为串用hash表判重、按位压缩存储状态、双向广搜、A*算法. (poj1768,poj1184,poj1872,poj1324,poj2046,poj1482)
深搜的优化:尽量用位运算、一定要加剪枝、函数参数尽可能少、层数不易过大、可以考虑双向搜索或者是轮换搜索、IDA*算法. (poj3131,poj2870,poj2286)
五.动态规划
需要用数据结构优化的动态规划.(poj2754,poj3378,poj3017)
四边形不等式理论.
较难的状态DP(poj3133)
六.数学
组合数学.
1.MoBius反演(poj2888,poj2154)
2.偏序关系理论.
博奕论.
1.极大极小过程(poj3317,poj1085)
2.Nim问题.
七.计算几何学.
半平面求交(poj3384,poj2540)
可视图的建立(poj2966)
点集最小圆覆盖.
对踵点(poj2079)
⑷ 对于年轻的程序员,知识的深度还是广度哪个更重要
对年轻的程序员,知识的广度必须要具备,见多识广,职责分明,但是在处理和识别事物上就必须要有深度的内涵去处理事情。
⑸ 程序员的职业发展路线应该是由广度到深度还是由深度到广度
五部曲:
1. 打基础
2. 广泛涉猎
3. 深入某领域
4. 研究哲学与艺术
5. 研究颈椎病的治疗方法
⑹ 程序员的十种级别
第一级:神人,天资过人而又是技术狂热者同时还拥有过人的商业头脑,高瞻远瞩,技术过人,大器也。如丁磊,
求伯君。
第二级:高人,有天赋,技术过人但没有过人的商业头脑,通常此类人不是顶尖黑客就是技术总监之流。
第三级:牛人,技术精湛,熟悉行业知识,敢于创新,有自己的公司和软件产品。
第四级:工头,技术精湛,有领导团队的能力,此类人大公司项目经理居多。
第五级:技术工人,技术精湛,熟悉行业知识但领导能力欠加,此类人大多为系分人员或资深程序员,基本
上桀骜不逊,自视清高,不愿于一般技术人员为伍,在论坛上基本以高手面目出现。
第六级:熟练工人,技术有广度无深度,喜欢钻研但浅尝辄止。此类人大多为老程序员,其中一部分喜欢利用工
具去查找网上有漏洞的服务器,干点坏事以获取成绩感。如果心情好,在论坛上他们会回答菜鸟的大部
分问题。此级别为软件业苦力的重要组成部分。
第七级:工人,某些技术较熟练但缺乏深度和广度,此类人大多为程序员级别,经常在论坛上提问偶尔也回答菜
鸟的问题。为软件产业苦力的主要组成部分。
第八级:菜鸟,入门时间不长,在论坛上会反复提问很初级的问题,有一种唐僧的精神。虽然招人烦但基本很可
爱。只要认真钻研,一两年后就能升级到上一层。
第九级:大忽悠,利用中国教育的弊病,顶着一顶高学历的帽子,在小公司里混个软件部经理,设计不行,代码
不行,只会胡乱支配下属,拍领导马屁,在领导面前胡吹海侃,把自己打扮成技术高手的模样。把勾心
斗角的办公室文化引入技术部门,实在龌龊!
第十级:驴或傻X,会写SELECT语句就说自己精通ORALCE,连寄存器有几种都不知道就说自己懂汇编,建议全部
送到日本当IT产业工人,挣了日本人的钱还严重打击日本的软件业!
⑺ 从深度和广度上开源是什么意思
开源(open source)这个术语是指人们可以修改和共享的东西,因为它的设计是可以公开访问的。
该术语起源于软件开发的上下文,用于指定创建计算机程序的特定方法。但是,今天,“开源”指的是更广泛的价值集,我们称之为“开源方式”。开源项目,产品或计划包含并赞扬开放交流,协作参与,快速原型制作,透明度,精英管理和面向社区的发展的原则。
什么是开源软件?
开放源码软件是带有源代码的软件,任何人都可以对其进行检查、修改和增强。
“源代码”是大多数计算机用户从未见过的软件的一部分;这是计算机程序员可以用来更改软件(即“程序”或“应用程序”)工作方式的代码。有权访问计算机程序源代码的程序员可以通过向计算机程序添加功能或修复无法始终正常运行的部件来改进该程序。
开源软件和其他类型的软件有什么区别?
有些软件的源代码只有创建它的个人、团队或组织才能修改,并且保持对它的独占控制。人们称这种软件为“专有的”或“闭源的”软件。
只有专有软件的原始作者才能合法地复制,检查和更改该软件。并且,为了使用专有软件,计算机用户必须同意(通常通过签署他们首次运行此软件时显示的许可),他们不会对软件作者未明确允许的软件做任何事情。Microsoft Office和Adobe Photoshop是专有软件的示例。
开源软件则不同。它的作者将它的源代码提供给其他想要查看、复制、学习、修改或共享代码的人。LibreOffice和GNU图像处理程序就是开源软件的例子。
就像使用专有软件一样,用户在使用开放源代码软件时必须接受许可条款,但是开放源代码许可的法律条款与专有许可的法律条款有很大不同。
开源许可证影响人们使用、研究、修改和分发软件的方式。一般来说,开放源码许可证允许计算机用户将开放源码软件用于他们希望的任何目的。一些开源许可,有些人称之为“left”许可,规定任何发布修改过的开源程序的人必须同时发布该程序的源代码。此外,一些开放源码许可证规定,任何修改和与他人共享程序的人也必须共享该程序的源代码,而不收取任何许可证费用。
通过设计,开源软件许可证促进了协作和共享,因为它们允许其他人对源代码进行修改,并将这些修改合并到他们自己的项目中。他们鼓励计算机程序员随时访问、查看和修改开放源码软件,只要他们在共享工作时允许其他人也这样做。
开源软件仅对计算机程序员重要吗?
开源技术和开源思想对程序员和非程序员都有好处。
因为早期的发明者将互联网本身建立在开源技术之上,比如Linux操作系统和Apache Web服务器应用程序,今天任何使用互联网的人都能从开源软件中受益。
每当计算机用户浏览网页、查看电子邮件、与朋友聊天、在线播放音乐或玩多人视频游戏时,他们的计算机、移动电话或游戏机都会连接到计算机的全球网络,使用开源软件将数据路由并传输到他们面前的“本地”设备。完成所有这些重要工作的计算机通常位于用户看不到或无法实际访问的遥远地方,这就是为什么有些人称这些计算机为“远程计算机” 。
越来越多的人依赖远程计算机来执行他们本可以在本地设备上执行的任务。例如,他们可能使用在线文字处理、电子邮件管理和图像编辑软件,而这些软件并不是安装在他们的个人电脑上运行的。相反,他们只是通过Web浏览器或移动电话应用程序访问远程计算机上的这些程序。当他们这样做时,他们从事的是“远程计算”。
有些人把远程计算称为“云计算”,因为它涉及的活动(如存储文件、共享照片或观看视频)不仅包括本地设备,还包括形成周围“氛围”的远程计算机全球网络。
云计算是日常生活中越来越重要的一个方面,有了互联网连接的设备。一些云计算应用,比如谷歌应用,是专有的。其他的,比如ownCloud和Nextcloud,都是开源的。
云计算应用程序运行在帮助它们平稳高效运行的附加软件之上,因此人们经常会说运行在云计算应用程序之下的软件充当了这些应用程序的“平台”。云计算平台可以是开源的,也可以是封闭的。OpenStack是开源云计算平台的一个例子。
人们为什么喜欢使用开源软件?
人们出于多种原因,更喜欢开源软件而不是专有软件,其中包括:
控制。许多人喜欢开源软件,因为他们对这种软件有更多的控制权。他们可以检查代码以确保它没有做任何他们不希望做的事,并且可以更改不喜欢的部分。非程序员的用户也将从开源软件中受益,因为他们可以将其用于任何期望的目的,而不仅仅是他人认为的方式。
训练。有些人喜欢开源软件,因为它可以帮助他们成为更好的程序员。由于开放源代码是可公开访问的,因此学生在学习制作更好的软件时可以轻松地学习它。 学生还可以在发展技能时与他人分享他们的作品,邀请他们发表评论和批评。当人们发现程序源代码中的错误时,他们可以与他人共享这些错误,以帮助他们避免自己犯同样的错误。
安全。有些人喜欢开源软件,因为他们认为它比专有软件更安全和稳定。因为任何人都可以查看和修改开源软件,所以有人可能会发现并纠正程序原始作者可能错过的错误或遗漏。而且由于有如此多的程序员可以在不要求原始作者许可的情况下开发一款开源软件,因此与专有软件相比,他们可以更快地修复,更新和升级开源软件。
稳定性。对于重要的长期项目,许多用户更喜欢开源软件而不是专有软件。由于程序员公开分发开源软件的源代码,因此依靠该软件执行关键任务的用户可以确保,如果他们的原始创建者停止开发它们的工具,他们的工具也不会消失或停用。 另外,开源软件倾向于结合并根据开放标准进行操作。
社区。开源软件常常会激发用户和开发人员围绕它形成一个社区。这并不是开源所独有的;许多流行的应用程序都是聚会和用户组的主题。但是在开源的情况下,社区不仅仅是一个购买(情感上或经济上)精英用户群的粉丝基础;是那些开发、测试、使用、推广并最终影响他们所喜爱的软件的人。
“开源”不就是免费的吗?
这是对“开源”含义的普遍误解,这个概念的含义不仅是经济上的。
开源软件程序员可以为他们创建的或贡献的开源软件收费。但是在某些情况下,因为开放源码许可可能要求他们在向其他人出售软件时发布源代码,所以一些程序员发现向用户收取软件服务和支持费用(而不是软件本身)更有利可图。通过这种方式,他们的软件仍然是免费的,他们通过帮助他人安装、使用和故障排除来赚钱。
虽然有些开源软件可能是免费的,但是掌握编程和排除开源软件故障的技能是很有价值的。许多雇主特别希望雇佣有开发开源软件经验的程序员。
什么是“软件之外”的开源?
开源不仅是开发和许可计算机软件的一种方式,也是一种态度。接触生活的方方面面“开源方式”意味着表达一种分享的意愿,以一种透明的方式与他人合作(这样其他人也能看到并加入),接受失败作为一种改进的方式,并期待,甚至鼓励其他人也这样做。
这也意味着致力于在改善世界中发挥积极作用,只有当每个人都可以使用设计世界的方式时,这才有可能实现。
这个世界充满了“源代码”,包括蓝图,食谱,规则,它们指导并塑造了我们在其中思考和采取行动的方式。我们认为此基础代码(无论其形式如何)都应该是开放的,可访问的和共享的,因此许多人可以将其改进。
⑻ 程序员学习技术是深度优先还是广度优先
个人建议广度优先。 因为你必须知道适合什么, 才能够确定自己想要深入的。公司有个孩子做了四年流媒体,发现根本不是自己喜欢的行业, 然后转行ios, 又开始从最底层做起。 转型有痛点, 如果不能博览整个行业, 没有一个整体的知识体系, 很容易沦为重复劳动的码农。
⑼ 做程序员需要靠关系吗
程序员固然要靠实力取胜,但是吃青春饭的,中年以后晋升管理层就需要人脉了。其实,不管做什么行业,人脉都很重要,人脉意味着能优先接触更多机会。加油!
⑽ 由程序员到架构师,应该是先注重技术的广度还是深度
架构师要对框架的原理理解透彻,对设计模式深入理解。
而程序员更多的是熟练掌握一门语言,在需求设计明确之后予以实现(此时框架都已经确定好了)。
二者所需的领域知识是不同的,不是技术的广度和深度问题。