‘壹’ 程序员开发时要考虑那些安全问题
代码范围
1,不安全的pageload,
2,不安全的get/post
3,不安全的read/write 权限
4,不安全的html element
5,不安全的jscript/ajax
6,不安全的webservice/remoting
7,不安全的passport
8,不安全的IIS主机
9,不安全的data source主机
更多的安全性问题来自于本地用户对主机的操作.和人为的具有管理权限的账户泄露.
‘贰’ 作为一名程序员,从事技术管理工作,应该注意什么事情
从程序员到技术管理,这要用人力资源管理的专业知识来看,就是一个非常典型的从“个人贡献者”向“团队管理者”角色转变的过程,这也是各公司人力资源部门会重点关注的一个群体,帮助这些新晋升为管理者的人员快速进行角色转换。
我将结合我人力资源从业生涯见到过的诸多案例、以及个人从员工升到管理层时的一些心路历程,来回答这个问题。
依赖下属完成业绩目标的管理者,最重要的就是解决两个问题,一个问题是让下属会干活、有能力干活;另外一个问题就是让下属有意愿干活,拥有一个能够好好干活的环境。
辅导和培养员工能够解决员工干活能力的问题,而激励下属及增强团队凝聚力则能够解决员工干活意愿的问题。主要分享3个主要方法。
‘叁’ 程序员,在开发的过程中应该注意哪些安全方面的问题
可忽视的误区 企业的软件开发能力取决于该企业的软件过程能力。如果一个企业软件过程能力越成熟,那么该企业的软件开发能力就越有保证。大量的实践经验表明,在体现企业软件开发能力的因素中,技术或工具并不是第一位的。其实,许多问题不是出在不懂怎么做,而是没有安排做,做的次序不对,或不知道怎样做得更好。 目前,比照软件过程管理模型(如图一),中国的软件企业中还存在各种影响过程改进的因素和误区,主要表现在个体和组织两个方面。 在组织方面,首先,中国软件企业实施CMM往往缺乏高级管理者的支持。其次,没有足够的SEPG资源。从很多情况考虑,SEPG成员要比其他CMM相关组综合素质高一个层次,CMM相关组的管理素质需要比技术类组高一个层次,才能顺利开展工作。第三,没有合适的先行者或者没有适当全局观的项目经理配合。被组织选为先行者的人员经常说自己没有时间,由于这些人都是从各个项目中抽出来的,一般人很难有足够的权力让他们为配合CMM做工作。最后,软件组织缺乏足够详细的项目计划和监督调整机制。 在个体方面,首先,手工作坊式的个人英雄主义情结成为实施CMM的制约。其次,某些软件开发人员错误地认为过程管理会影响或压抑专业人员的创造性,其实这是不清楚过程的定义造成的。第三,由于软件项目的成功更多地依赖于少数人员的杰出技术能力和项目管理能力,成功项目的经验不能得到最大限度的继承,软件生产的可重复性相对比较差。最后,软件企业人员变更相对频繁也增加了实施CMM的难度。 “三七”法则 在过程改进总体建议方面,应该从三个方面做准备,分七步走。 首先,在组织方面的准备上,除了要求高层经理出资支持CMM改善软件过程,委托具有管理职责的人员负责CMM实施之外,须成立软件工程过程组(SEPG),研究CMM、编写/修改必要的文档并推广文档;成立软件质量保证组(SQAG),研究软件质量保证技术及过程,编写/修改必要的SQA文档并推广已编写的文档,测量和分析项目进展情况,反馈项目过程状态,准备和评审过程、计划和标准,审计指定的软件工作产品以检验其遵从性,审计软件工作过程的符合性;成立软件配置管理组(SCMG),研究软件配置管理技术及过程,编写/修改必要的SCM文档并推广已编写的文档,建立必要的工具支持。 在知识准备方面,要加强培训工作,建立内部过程评估队伍和庞大的过程改善队伍。对各角色人员进行专项培训,普遍开展软件工程基础及CMM的培训,使每个岗位的人员都具备过程改进的意识,并掌握所必需的过程改进知识和技能。此外,要重视对软件工程的研究,包括方法、工具和过程,加速培养过程改进的骨干队伍。 在能力准备方面,建立有效的软件项目管理,文档化且遵循软件项目管理过程,在建立管理过程中,使用组织的方针来指导项目,建立基本软件工作产品完成准则和检查单,并迅速实施,然后根据反馈意见及时修改。坚持适当的监控机制,例如对项目进度进行跟踪而建立的例会制度,制度化的日报和周报活动。做好实际数据收集、测量与分析工作等。重复成功的以前项目的开发经验。 改进过程总体可以分为以下七个步骤。 确定目标:确定在一段时间内达到的改进等级。 状态诊断:把过程改进要达到的状态与目前的状态作比较,找出存在的差距。 制定计划:“凡事有计划,按计划办”不仅是CMM强调的,也是软件开发过程中应该注意的。 规程制定:过程改进的一个重要的地方就是“事事有规程,时时有记录”,这样,即使关键人走了,原来的事也能继续而不致产生过多的停顿。 过程试点:制定了规程后,要对行动计划按执行过程的情况进行适当调整。其中,尤其要注重评审和验证,实现定期监控,注意采集度量数据。 反馈修正:总结过程试点的经验,修订规程。 过程推广:扩大应用范围。 软件过程改进实施步骤 公司的过程改进活动也是一个项目,并且是很大的项目,涉及的人员、技术和资源都很多,还要平衡现有产品或项目的进度等。同时,它也是一个不断往复,螺旋上升的一个过程。 第一个步骤为高级经理下定决心,提供足够的资源来主持并完成前期的准备工作,这个阶段核心是评价SEPG组长的资格和资质,还包括评估培训、购买工具的预算及相应资金能否及时到位。 无论是软件商业化的过程或CMM实施的过程之中,建立规范化的易于操作的软件开发行为规范都是首先要做的工作。但是,切记,编制规范的时间一定不能长,以10到12个工作日为宜,文档不宜过多,以5~6个规程为好(对应5个或6个关键过程域),这是第二个关键阶段。评价标准可以是SEPG组长能够顺利、流畅地讲解其制定的规程。在规程编制阶段必须有老板或常务副总直接领导CMM工作。但是一定要记住,制定的过程要遵从“从实践中来,到实践中去”,同项目经理、有经验的开发人员研究、讨论,从而使SEPG组长能够及时反映工作中的问题,并且问题能够得到及时解决。 第三个步骤是制定并发布公司的评估方针和方案,包括开发体系重组过程中的激励措施,中层在此阶段必须介入,这关系着过程改进的结果。SEPG和CMM实施的周例会,必须有高级经理参加,要有记录或录音作为证据,是考核的一个指标。 除此之外,对于还没有进行基于CMM改进的企业,还要重视设计复查、代码复查以及测试工作 。很多程序员习惯于“只做不想”这样一种工作方式,他们更关心每天可以写多少行代码,完成几个模块,在这种态度下,他们都很不愿意复查自己的工作,而习惯于在软件测试阶段把隐藏的错误改正过来。CMM实施过程,就是要通过各种复查,沟通信息,及早发现并更改问题。 在实施了初始的过程或技术部署后,培训成了主要问题。但人员变动时,附加培训的必要可能没被认识到,管理技能的培训尤为重要。而对于那些由于过硬的技术而被提升到管理职位的人员,需要接受一整套新技能的培训,包括人际关系技能。 项目经理在整个过程改进中(尤其是CMM二级)的工作量大约要占到整个总量的一半到四分之三,在评估访谈时也占有了举足轻重的地位。有些项目经理认为自己心里有一套计划,只要按计划进行就可以按时保质完成项目,但事实并非如此,在项目组之间的协调问题上,高层经理的作用是非常明显的。 试点或模拟项目可以很小,哪怕只有两个人,或者联合SEPG进行指导全部公司的模拟项目,这是缩短试验的最好途径。先组织配置管理活动的培训或学习,配置管理活动和质量保证活动在此期间可以得到很好的练习。 CMM为软件企业的过程能力提供了一个阶梯式的改进框架,它基于过去所有软件工程过程改进的成果,吸取了以往软件工程的经验教训,提供了一个基于过程改进的框架; 它指明了一个软件组织在软件开发方面需要管理哪些主要工作、这些工作之间的关系、以及以怎样的先后次序,一步一步地做好这些工作而使软件组织走向成熟。 但是由于CMM中不研究所有软件过程和质量改进问题,也未提供有关实现子过程域所需要的具体知识和技能,因此要进行个体软件过程PSP的实践活动,以填补这一空白,并优化过程改进途径。
‘肆’ IT面试经验:程序员面试什么最重要
程序员面试一直是社区乐于讨论的热门话题。我自己从06年实习以来,先后经历了4家软件公司,全部是外企,其中有世界500强的通信企业,有从事期权期货交易的欧洲中等规模的金融公司,也有为大型汽车制造商开发Android智能汽车的新兴公司。跨入IT行业以来,我在求职过程中经历过多次面试,最近两年也有过多次面试别人的经验。我感觉现在到了对这个问题发表自己看法的时候,这篇文章是我站在面试官角度对于程序员面试问题的一个阶段性反思和经验总结。
目标
相信和不少朋友一样,有了几年工作经验成为Senior后就开始了面试别人的经历。我在最初这个阶段只是按照自己的想象把”找到基础好的程序员“,”找到算法能力优秀的程序员“,”找到有Android开发经验的程序员“等作为面试的目标。但是,实际的经历告诉我,尤其是按“基础好”,“算法好”这些目标招到的人最终效果并不好。比如,有的面试者基础知识和算法掌握情况不错,进程、线程、内存等概念清晰,基本的Hash,二叉树,快速排序等数据结构和算法也比较熟悉,但是进公司后在实际工作中表现得很糟糕。后来,我才发现原来是我的面试目标出了问题,我原先的面试方法更像是大学的算法或操作系统期末考试,按照这种方法让许多并不合适的人通过了面试,同时也可能错过了许多合适的人。
后来,我的反思是,从公司的角度讲,面试的根本目的是找到“能够干好工作”的人,而“高学历”,“算法好”,“基础好”,“有经验”这些都是表象而不是根本,它们并不能直接和“工作好”划等号。
方法
目标明确了,但接下来的问题是假设面试者是一个黑盒系统,“工作好”不是直接可观测变量,你所能直接观测的变量是基础、算法、经验、学历、性格、谈吐、年龄等等。所以,实际上,你只能从“基础好”,“算法好”等可以直接观测的量去推测“工作好”的概率,这就是一个在“X好“条件下”工作好“的条件概率问题:P(工作好 | X好)。
根据这个模型,面试所应该考察哪些方面就很明显了,那就是选择那种最具有区分性的方面来考察。比如,考察面试者的体型特征没有太大意义,因为P(工作好|高),P(工作好|矮),P(工作好|胖),P(工作好|瘦)的概率都差不多;所以,体型特征不具有区分性,这不是面试所应该关注的内容。
面试官应当结合职位的要求明确哪些因素具有比较好的区分性。比如,如果要招一名技术门槛比较高的3D游戏引擎开发工程师,面试者A具有3D游戏引擎开发的经验,但是在基础知识和算法面试方面表现一般;面试者B相反,基础知识和算法面试表现很好,但没有游戏开发经验,而你只能选择其一。你选谁呢?其实,这就是两个条件概率问题P(工作好|经验好,基础一般,算法一般)和P(工作好|没经验,基础好,算法好)。这个问题就留给面试官来判断了,就我个人而言,对于技术门槛较高需要技术积累的职位,经验更加说明问题,因此,我更倾向于面试者A。
下面,我再结合自己的经验谈谈对面试中常见方面的看法。
算法
算法是Google和MS等大公司面试所重点考察的内容。我个人很喜欢算法,曾经参加ACM/ICPC拿过北京赛区的13名。但是,就个人经验来看,我所接触过的绝大多数开发职位而言,算法都不适合作为考察面试者优劣的主要因素。对于普通的非算法性开发职位,考察面试者的算法就相当于考察他打乒乓球好不好一样,与目标“工作好”的相关性太低。就我个人的经验来看,差不多P(工作好|算法好)=50%,也就是算法面试没有太大的区分性。
甚至,还有一种很不好的情况特别多地出现在算法好的面试者身上,我称之为“只磨刀,不砍柴”。什么意思呢?有类人只对什么A*算法,异步编程,JVM类加载机制这种纯技术问题感兴趣,对实现用户需求毫无兴趣。这类人看起来有一定的技术能力,但是对公司来讲贡献十分有限,甚至不如技术一般但认真负责的人。所以,一旦遇到面试者算法好,我就特别留意考察会不会是这种“只磨刀,不砍柴”的人。
另外,虽然我个人不了解Google和MS,但我对于其特别重视考察算法能力的面试策略是持怀疑态度的。即使在这样的世界级大公司,算法虽然重要,但可以想象在项目实施过程所遇到的各种各样问题中,算法问题绝大多数时候不会是主要瓶颈,没有到那种需要每个人都是算法高手的情况。实际上,绝大多数项目真正难点并不是一两个算法瓶颈,甚至也不是单点的技术瓶颈,而是系统性的组织、协调、设计、开发问题,有大量的看起来不是那么有技术含量的脏活累活,也有许多问题是由于信息不足,并不是技术能力强就能克服这些困难。一个团队最好优势互补,有人算法强,有人业务分析能力强,有人擅长后端服务,有人擅长前端界面,有人聪明,有人踏实,这是最好的。如果按照“算法好”的单一标准选材,必定会把许多优秀的人才拒之门外。
基础
基础面试是指考察诸如指针使用、进程线程概念等基础知识的面试,十分类似于大学期末考试题。我曾经以为基础面试十分重要,但是现在不这么看了。在工作中基础的确是重要的,但是在面试过程中,它必须具有区分性才有意义,也就是说P(工作好|基础好)的概率要高,那么考察指针使用,进程线程区别这样的基础题目才有它的意义。我的实际经验是,基础面试并不具有很好的区分性,和算法一样, 差不多P(工作好|基础好) = 50%。同时,基础面试是最容易准备的,中国人有长期的应试教育经验,要准备几个把玩指针题目太容易了。
我曾经遇到过这样的面试者,他的C语言基础和编译、链接等原理掌握得非常好,给我留下了深刻的印象,我给的面试结论是:知识面不宽,只会C语言,但基础很扎实,建议录用。后来的事情证明了那个结论的前半部分是对的,但是”建议录用“错了。他在实际工作中表现得一塌糊涂,不理解需求,不理解整体架构;同时,上班时间不是花在项目上,而是花在阅读诸如《程序员的自我修养》之类的书籍上。最后,这位同事由于长期“不出活”离开了公司。
基础不是不重要,而是“基础好”不足以说明面试者能干好工作,因为基础是属于局部性知识,而实际工作需要综合性能力,二者有天壤之别。C语言、操作系统能考高分,但是不会写程序的人在大学我们还见得少吗? 软件开发就像盖房子,综合能力是设计和搭骨架,基础知识是码砖。张小龙原先Foxmail是Delphi开发的,他它不懂C#,你如果要招聘一个开发.NET Email客户端的人,你考察他对CLR掌握得好不好有意义吗? 让张小龙来开发一个C#版的Foxmail真的会有困难吗? 你招一个精通C#但没有Email客户端开发经验的人来真的比张小龙靠谱吗?
我说基础知识不重要,和古人说的“不积洼步无以至千里”是不是矛盾呢?不矛盾!“洼步”与“千里”是一种可累加关系,但再多的“基础知识”都累加不成“综合能力”。学习软件开发要像持续集成一样,一开始就是一个完整的系统,虽然规模不大,问题很多,但它麻雀虽小五脏俱全,从小系统到大系统,从简单系统到复杂系统逐步演化。
所以,基础好本身不足以说明太多的问题,必须进一步考察综合能力。对于基础面试表现不好的面试者,如果时间允许也要进一步考察,有的面试者其实是有能力的,只是没有进行充分的准备。最理想的状态当然是基础和综合能力俱佳,若不能兼顾,应当综合能力优先。
经验
这里所说的经验不是通过工作了多少年来衡量的,而主要是指面试者的经历,比如,是否完整地实现过一个软件,或作为主要开发者完成过一个项目。经验的重要性在于它能说明一个人的综合能力。从项目的性质、规模和难度,面试官就可以大致判断出面试者的综合能力。如果一个面试者一直在大公司负责一个小模块的开发维护,那么基本可以判断他不具备独立或作为主要开发者承担一个项目的能力,只适合在另一家大公司做类似的事情。对于门槛较高需要长期技术积累的职位,相关经验更显得尤为重要,比如,linux内核开发,JVM开发,游戏引擎开发,数据库实现,高级UX等。对于这类职位,没有经验的面试者即使综合素质不错也是需要长时间的学习和积累才能胜任。所以,基本上如果确定了你的职位属于此类,那么相关经验毫无疑问应该成为首选因素,换句话说,P(工作好 | 相关经验好)的概率是非常高的。
通过项目经验判断面试者的优劣比通过基础和算法测试更加靠谱,所以,面试过程中面试官应该花比较多的时间听面试者介绍项目经验,并进行深入地探讨交流,了解面试者的知识面、思维能力、表达能力等。同时,可以结合项目提一些基础知识和算法的问题,比如,如果面试者做过C++相关的项目,那就可以问他如何进行内存管理?是否熟悉智能指针?如果面试者的回答不能令人满意,那么就基本上可以判断他的项目做得不是很好。
要注意的是,经验也是一个多维度的事物。比如,C++股票交易中间件系统,这就涉及(C++,中间件,股票) 3个维度。假如面试者A做过C++股票交易客户端,面试者B做过C的股票交易中间件。从语言角度看,A最匹配,从项目性质看,B最匹配,你如何选择?这就是在多个维度中,哪个维度更重要的问题,就这个例子而言,我个人更倾向于B,因为我认为中间件开发经验是主要矛盾,而从C切换到C++并不是问题。所以,面试官需要判断哪一种经验是主要的,而哪一种经验是次要的。比如,我们招聘Android应用开发,这个职位的Android技术门槛并不高,它的真正难点在于做出好的用户体验(UX)。所以,如果一个面试者没有Android的经验我们是可以接受的,但是我希望他在UX方面有经验,至少做过其他平台的移动应用开发。
性格
现在,我来谈我认为最重要的因素:性格。这可能是许多初为面试官的朋友所难以想象的,怎么会是性格最重要呢?说实话,当我意识到这一点时,我自己也很惊讶!说白了,还是 P(工作好|性格好)的概率最高啊。我的实际经验是,如果一个人的性格好,他能把工作做好的可能性是最高的,性格好远比基础好、算法好要靠谱。
一个人如果技术上有缺陷,经验上有不足,但性格好,在团队中是很容易由其他人来补位的,他自己也很容易逐渐补起来;相反,如果一个人的性格不好,所有的技术优势经验优势都发挥不出来,甚至还会起到负作用,而且性格缺点很难改变。我一直谈到实际工作所需要的是综合性的能力,这种综合能力的发挥中性格是至关重要的。项目中不止会遇到技术问题,要涉及沟通、协调,不同的人不同的部门既有合作又有磨擦,如何处理这些事情都需要一个良好的性格。可以说,在开发团队里让你与众不同的不是你从哪个学校毕业,也不是你过去的经验,而是你的性格。
当然,性格是一个复杂的东西,它包含了很多的方面,并非所有方面都是程序员面试所需要关注的。我的经验是可以重点考察这些方面:
1) 态度积极还是消极。有的面试者在谈吐中就会自然给你一种积极上进的感觉,或者你可以在他的经历中发现他积极的因素,这些都不是太难看出来的。相反,有的面试者你能明显感觉到他的消极情绪。积极性在工作中是十分重要的,积极的人能给团队带来朝气,也更易于合作。基本上,如果确定面试者属于态度积极的,他通过我这一关的可能性就会大大增加;相反,如果确定属于态度消极的,即使技术能力不错我也会十分谨慎。
2) IQ。我的经验是,总体来看,聪明的人在工作中的表现更为优秀。在面试中要考察一个人是否聪明并不一定要像Google和MS那样找些专门测试IQ的智力题,其实,你只需要看他讨论问题是不是很有逻辑性,思考和说话是不是反应敏捷就可以做出大致的判断。另外,眼睛是人心灵的窗户,一个人聪明与否,眼睛是会说话的。不过,聪明也不完全是优点,比如,当公司或项目遇到困难时,往往是聪明人先跑掉了,坚守的往往是IQ一般的人。
3) 语言表达能力。语言表达能力也是程序员十分重要的一项素质,它关系到项目中的沟通是否顺畅。面试官可以看看面试者能否用简明的语言介绍清楚曾经做过的项目,能否抓住要点,能否考虑到听者的相关背景。一般来讲,语言表达能力强的人综合能力都不会太差。
4) 是否具有用户意识。有人说程序员是做研发的,哪来什么用户?只有销售、市场人员才会和用户打交道。其实,这是完完全全的错误认识。你写一个模块,甚至一个API,只要有别人用,他就是你的用户。有的程序员设计一个模块或是一个软件总是习惯于从使用者的角度来考虑,尽量地方便使用者,这就是一种良好的用户意识。具有良好的用户意识的人更能考虑别人的感受和整体的需要,而不是单纯地从自己和局部来思考问题。当面试者谈及过去的项目经验时,面试官可以常常站在用户的角度对其进行提问,从这个过程中观察其是否具有良好的用户意识。
5) 如何应对质疑和压力。面试官应该对面试者的回答以及以往项目进行合理的质疑,看看他如何应对。曾经有一位面试者谈到做游戏登录服务器的经历,我就问:“如果登录服务器挂了,怎么办呢”?他说原先虽然没有考虑这个问题,但是可以怎么怎么改进。其实,大家都理解项目中有各种不完美,这里面原因很多,只要面对质疑和压力能从容应对努力往好的方向思考解决就可以了,不需要掩饰缺陷,更不应该有情绪。我遇到过有的面试者,一旦你对其项目提出质疑,他马上产生反抗情绪,或不高兴,或不承认有问题,这很容易一下子看出来他在工作中容不得质疑和批评,这种人要想合作就很困难。
6) 个性特点。许多面试者喜欢在简历上写“精通C++/Linux“,这些字眼看得人麻木,如果有人写”喜欢C++/Linux“,我就会有一种眼前一亮的感觉。“精通”是没有感情色彩的叙述,而“喜欢”包含了面试者的个性,我更愿意看到面试者的个性。我相信对某样东西真正的热情远比你当前对它的掌握程度更为重要。其实,N年的经历告诉我们,同一个班的同学,同一个项目组的同事,虽然每天所学的知识,所接触的工作都是相同的,但其实每个人的成绩和表现差异是十分明显的。那么,到底本质的差异是什么呢?其实,就是每个人的个性。是个性使得有的人业余时间去打球,有的人业余时间去看书,有的人喜欢Linux,有的人喜欢Mac。一个人在团队中扮演的角色也和他的个性有很大的关系。面试官应该引导面试者展现自己的个性,并判断其是否有益于团队。
总结
最后总结起来,我的经验是: 1) 面试官的目标是找到”工作好“的人,一定要围绕这个目标来进行面试,如果把面试当成了算法或操作系统期末考试这就走入了误区;2) 面试过程是通过学历、性格、基础、经验、算法等可以测试的因素去综合判断面试者“工作好”的概率;3) 在各种因素中,性格 > 经验 > 基础 > 算法。性格是最重要的,如果性格不好,所有技术能力都会大打折扣,而且技术缺陷容易弥补,性格缺陷很难改变;经验体现了一个人的综合能力,你可以从面试者过去的经历中判断他能从事哪种工作,不能从事哪种工作;基础和算法则主要起到辅助参考的作用,基础好的程序员一般适应性比较强,学新技术更快,但是切忌单纯从基础来判断一个人的能力。
‘伍’ hr面试程序员问什么问题,程序员在面试的时候的注意事项
01 和优秀开发者沟通
如果你本身没有编程背景,那就尽量找到一些优秀的开发人员给你指点迷津。
02 问专业的问题
1. 简要介绍一下你自己以及你最近在做的项目吗?
作用:这个问题可以让你更好地了解你的候选人,而谈论近期工作能了解他对工作的热情和奉献。
2. 其他时间有别的项目要做吗
作用:鉴于你的项目的时间长短和工作复杂程度,你可能只想找一个能完全投入到这个项目的人。但是很多程序员都会同时兼顾好几个项目,你要确保彼此双方的需求是什么。
3. 你是怎么看待自己的身份的?开发?产品经理?还是二者都是?
作用:理想的回答一般是‘二者都是’, 但是你要认真评估每个候选人可能给你团队带来的有利和不利影响。产品经理可以帮助设计新的功能和交互,但是你也需要足够的开发才能跟上方向从而建构你想要的内容。
4. 你会如何管理一个程序员团队?
作用:这个问题可以帮你了解候选人的领导能力和风格。
5. 告诉他们公司想要的人是怎样的。
作用:直截了当地告诉对方你的期望。像工作时间,项目长短,目标等等,这些都是对方很想知道的。就像你评价他是否适合公司一样,对方也会评价你的公司是否适合他。
03 去合适的地方招聘
你不能指望天上会掉下个好程序员给你,微软和谷歌的优秀程序员也不会自己蹦到你跟前。你的机会在于,很多这样的程序员都拥有或追求商业想法。
你可以多去一些网站、活动大赛等地方探索发掘,这比你在社交网站上找到他们的运气要大得多。
· 编程大赛
编程大赛就是程序员高手们云集在一起,合作共同完成一个软件的开发。
猿圈会定期举办此类招聘编程大赛,帮助企业挑选优质人才,提高企业品牌雇主形象。
· 开放性源代码贡献者
一些网站比如GitHub,提供在线代码存储库, 程序员可以自由对开源项目贡献自己的代码。
所以,在招聘之前,你可以先去这种网站上找一找有潜力的候选人。
· 大学
· 软件开发大会
尽可能多的去参加一些和你的产品相关的软件开发大会。
· 技术博客
你能根据他们的博客判断他们的技术技能、解决问题的能力以及写作和沟通能力。
04 没通过编程测试,坚决不录用
你只能记住一条原则,那必须是,没有让候选人参加编程测试之前,千万不能决定录用与否。
通常情况下,出于项目的紧迫,我们会倾向于选择看起来靠谱的第一个程序员,但是不拿到他的编程测试结果,不要冲动地下offer。
我也是个不懂代码的HR,但是我善于利用各种各样的工具,前段时间发现了一个猿圈测评的工具,我用它测试程序员候选人,通过测试结果判断是否值得邀约来面试,这个我觉得很赞,你可以试试看
‘陆’ 程序员应该注意哪些身体健康他们容易患什么职业病
没吃过泡面不算程序员,没加过班的不是程序员,久而久之各种健康问题就来了,当然小编也知道要要因人而异,不同的职业会引发不同的毛病。据国外的一项调查表明,头发的变化与相应人群在年龄,性别甚至职业上都有明显的特征,程序员的脱发现象,很有可能是因为长时间工作压力大,长期加班和睡眠障碍,作息混乱等等原因造成的亚健康。
如何很快的淘汰一个人,是让他太忙,忙到没有时间休息,没有时间创造思维,没有时间学习,才为可怕。所以,请拥有好心态,技术学不完,时间是自己的。有些关于身体上的一些疾病自己要注重,毕竟身体是自己的,别人无法与你一起承受疼痛。
‘柒’ 程序员面试常见问题有哪些
你有没有做过什么项目,这个问题要回答得简明扼要,直接简洁地描述你参与过的项目和在里面扮演的角色。面试官是想看看你是不是真的参与项目了,你对项目的把控度、你在项目里担当的角色、对项目类型以及你对项目应用的了解。通过你的回答,有经验的面试官能看的出你对这个行业的认识。
‘捌’ 你要面试一个程序员,应该问他什么问题
首先面试程序员分有没有经验
面试没有经验的程序员就随便问问点ssm,ssh五大框架问题,多线程什么的,再问问是否会点前端技术
有经验就看看他的简历,问他简历项目上的问题,可以围绕着简历上的项目问,通过他的回答涉及到的技术点之类的,拓展出去问其他的
‘玖’ 程序员日常生活面临的问题和挑战有哪些
一、熬夜
很多程序员将熬夜变成了生活习惯,还口口声声解释“程序员只有在晚上效率才高”,这是非常扯淡的理论。有人将程序员做下图的类比,虽然比较贴切,但这种方式对你的健康伤害是最大的。建议你尝试一下晚上10点睡觉,早上6点起来工作的作息方式,也许会事半功倍。
二、久坐
有些程序员在电脑面前一坐就是一天,中间除了吃饭上厕所外,基本不起来动动。这是非常不好的习惯,时间久了,很容易得肩周炎、颈椎病,到时候后悔就晚了。建议每坐一个小时就起来动10分钟,主要是转转手臂和脖子。
三、外卖和泡面
很多程序员在饮食上也非常不注重健康,上班的时候为了贪图方便经常叫一些外卖,更厉害的是直接搞一桶方便面来做午餐。这里建议大家中午出去吃,荤素搭配,再可以弄点水果。
四、缺乏锻炼
建议在工作日下班后做一些简单的球类运动,乒乓球、羽毛球。
五、用眼过度
IT公司的员工的体检报告中大部分程序员都患有“慢性结膜炎”,当然对于这个病并不是长时间对着电脑引起的,但是用眼过度也会加剧“慢性结膜炎”的恶化。
建议大家平时准备防止眼干的眼药水,如果确定是结膜炎的话,还要及时去医院就诊。另外电脑的背景可以设成绿色,这样对眼睛也能起到一定的保护作用。
‘拾’ 做一个新手程序员应具体哪些知识
程序员是一种技术工作,在IT的发展中有相当重要的地位,从底层硬件通讯协议的建立, 到数据传输层的处理,到操作系统的建设,到数据库平台的建设,一直到应用层上各种数 据营销平台的搭建,程序员在里面都扮演着举足轻重的角色并为IT事业的发展做出了巨大 的贡献。
中国有很多精于编码的人,但是中国软件行业,尤其是网络应用开发方面误区很大,很难形成有规模的软件开发力量和产品能力,不但比美国差距甚远,和印度相比也是颇有不如。这些问题不是在于中国程序员的智商和工作努力状况,也不是在于国家和民间对开发的投入程度,而是很大程度上,有一些对技术,对程序开发,对项目设计方面的思想误区,这些误区,导致了软件行业的产品化能力不足,缺乏规模化和大型复用系统研发能力,可以说,改变认识误区,是解决软件行业小作坊模式和个体英雄模式所带来的局限性 的重要工作。
中国有很多小朋友,他们18,9岁或21,2岁,通过自学也写了不少代码,他们有的代码写的很漂亮,一些技术细节相当出众,也很有钻研精神,但是他们被一些错误的认识和观点左右,缺乏对系统,对程序的整体理解能力,这些人,一个网上的朋友说得很好,他们实际 上只是一些Coding fans,压根没有资格称为程序员,但是据我所知,不少小网络公司的 CTO就是这样的coding fans,拿着吓人的工资,做着吓人的项目,项目的结局通常也很吓 人。
程序员基本素质:
作一个真正合格的程序员,或者说就是可以真正合格完成一些代码工作的程序员,应该具 有的素质。
1:团队精神和协作能力
把它作为基本素质,并不是不重要,恰恰相反,这是程序员应该具备的最基本的,也是最重要的安身立命之本。把高水平程序员说成独行侠的都是在呓语,任何个人的力量都是有限的,即便如linus这样的天才,也需要通过组成强大的团队来创造奇迹,那些遍布全球的为linux写核心的高手们,没有协作精神是不可想象的。独行侠可以作一些赚钱的小软件发点小财,但是一旦进入一些大系统的研发团队,进入商业化和产品化的开发任务,缺 乏这种素质的人就完全不合格了。
2:文档习惯
说高水平程序员从来不写文档的肯定是乳臭未干的毛孩子,良好的文档是正规研发流程中 非常重要的环节,作为代码程序员,30%的工作时间写技术文档是很正常的,而作为高级 程序员和系统分析员,这个比例还要高很多。
缺乏文档,一个软件系统就缺乏生命力,在未来的查错,升级以及模块的复用时就都会遇 到极大的麻烦。
3:规范化,标准化的代码编写习惯
作为一些外国知名软件公司的规矩,代码的变量命名,代码内注释格式,甚至嵌套中行缩 进的长度和函数间的空行数字都有明确规定,良好的编写习惯,不但有助于代码的移植和 纠错,也有助于不同技术人员之间的协作。
有些coding fans叫嚣高水平程序员写的代码旁人从来看不懂,这种叫嚣只能证明他们自 己压根不配自称程序员。代码具有良好的可读性,是程序员基本的素质需求。
再看看整个linux的搭建,没有规范化和标准化的代码习惯,全球的研发协作是绝对不可 想象的。
4:需求理解能力
程序员需要理解一个模块的需求,很多小朋友写程序往往只关注一个功能需求,他们把性能指标全部归结到硬件,操作系统和开发环境上,而忽视了本身代码的性能考虑,有人曾经放言说写一个广告交换程序很简单,这种人从来不知道在百万甚至千万数量级的访问情况下的性能指标是如何实现的,对于这样的程序员,你给他深蓝那套系统,他也做不出太极链的并访能力。性能需求指标中,稳定性,并访支撑能力以及安全性都很重要,作为程序员需要评估该模块在系统运营中所处的环境,将要受到的负荷压力以及各种潜在的危险和恶意攻击的可能性。就这一点,一个成熟的程序员至少需要2到3年的项目研发和跟踪经 验才有可能有心得。
5:复用性,模块化思维能力
经常可以听到一些程序员有这样的抱怨,写了几年程序,变成了熟练工,每天都是重复写 一些没有任何新意的代码,这其实是中国软件人才最大浪费的地方,一些重复性工作变成 了熟练程序员的主要工作,而这些,其实是完全可以避免的。
复用性设计,模块化思维就是要程序员在完成任何一个功能模块或函数的时候,要多想一些,不要局限在完成当前任务的简单思路上,想想看该模块是否可以脱离这个系统存在,是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用,这样就能极大避免重复性的开发工作,如果一个软件研发单位和工作组能够在每一次研发过程中都考虑到这些问题,那么程序员就不会在重复性的工作中耽误太多时间,就会有更多时间和精力投 入到创新的代码工作中去。
一些好的程序模块代码,即便是70年代写成的,拿到现在放到一些系统里面作为功能模块 都能适合的很好,而现在我看到的是,很多小公司软件一升级或改进就动辄全部代码重 写,大部分重复性工作无谓的浪费了时间和精力。
程序员应具备的素质中
6:测试习惯
作为一些商业化正规化的开发而言,专职的测试工程师是不可少的,但是并不是说有了专职的测试工程师程序员就可以不进行自测;软件研发作为一项工程而言,一个很重要的特点就是问题发现的越早,解决的代价就越低,程序员在每段代码,每个子模块完成后进行认真的测试,就可以尽量将一些潜在的问题最早的发现和解决,这样对整体系统建设的效 率和可靠性就有了最大的保证。
测试工作实际上需要考虑两方面,一方面是正常调用的测试,也就是看程序是否能在正常调用下完成基本功能,这是最基本的测试职责,可惜在很多公司这成了唯一的测试任务,实际上还差的远那;第二方面就是异常调用的测试,比如高压力负荷下的稳定性测试,用户潜在的异常输入情况下的测试,整体系统局部故障情况下该模块受影响状况的测试,频发的异常请求阻塞资源时的模块稳定测试等等。当然并不是程序员要对自己的每段代码都需要进行这种完整测试,但是程序员必须清醒认识自己的代码任务在整体项目中的地位和各种性能需求,有针对性的进行相关测试并尽早发现和解决问题,当然这需要上面提到的 需求理解能力。
7:学习和总结的能力
程序员是人才很容易被淘汰,很容易落伍的职业,因为一种技术可能仅仅在三两年内具有 领先性,程序员如果想安身立命,就必须不断跟进新的技术,学习新的技能。
善于学习,对于任何职业而言,都是前进所必需的动力,对于程序员,这种要求就更加高 了。
但是学习也要找对目标,一些小coding fans们,他们也津津乐道于他们的学习能力,一会学会了asp,一会儿学会了php,一会儿学会了jsp,他们把这个作为炫耀的资本,盲目的追逐一些肤浅的,表面的东西和名词,做网络程序不懂通讯传输协议,做应用程序不懂中断向量处理,这样的技术人员,不管掌握了多少所谓的新语言,永远不会有质的提 高。
善于总结,也是学习能力的一种体现,每次完成一个研发任务,完成一段代码,都应当有 目的的跟踪该程序的应用状况和用户反馈,随时总结,找到自己的不足,这样逐步提高, 一个程序员才可能成长起来。
一个不具备成长性的程序员,即便眼前看是个高手,建议也不要选用,因为他落伍的时候 马上就到了。
具备以上全部素质的人,应当说是够格的程序员了,请注意以上的各种素质都不是由IQ决 定的,也不是大学某些课本里可以学习到的,需要的仅仅是程序员对自己工作的认识,是 一种意识上的问题。
那么作为高级程序员,以至于系统分析员,也就是对于一个程序项目的设计者而言,除了 应该具备上述全部素质之外,还需要具备以下素质:
第一,需求分析能力
对于程序员而言,理解需求就可以完成合格的代码,但是对于研发项目的组织和管理者, 他们不但要理解客户需求,更多时候还要自行制定一些需求,为什么这么说呢?
一般而言,进行研发任务,也许是客户提出需求,也许是市场和营销部门提出的需求,这时候对于研发部门,他们看到的不是一个完整的需求,通常而言,该需求仅仅是一些功能上的要求,或者更正规些,可能获得一个完整的用户视图;但是这都不够,因为客户由于非技术因素多一些,他们可能很难提出完整和清晰,或者说专业性的性能需求,但是对于项目组织者和规划者,他必须能够清醒认识到这些需求的存在并在完成需求分析报告的时候适当的提出,同时要完整和清晰的体现在设计说明书里面,以便于程序员编码时不会失 去这些准则。
程序设计者必须正确理解用户需求所处的环境,并针对性做出需求的分析,举例而言,同样一个软件通过ASP租用方式发布和通过License方式发布,性能需求可能就是有区别的,前者强调的是更好的支撑能力和稳定性,而后者则可能更强调在各种平台下的普适性和安 装使用的简捷性。
第二,项目设计方法和流程处理能力
程序设计者必须能够掌握不少于两到三种的项目设计方法(比如自顶至下的设计方法,比 如快速原型法等等),并能够根据项目需求和资源搭配来选择合适的设计方法进行项目的 整体设计。
设计方法上选择不当,就会耽误研发周期,浪费研发资源,甚至影响研发效果。
一个程序设计者还需要把很多功夫用在流程图的设计和处理上,他需要做数据流图以确立 数据词典;他需要加工逻辑流图以形成整体的系统处理流程。
一个流程有问题的系统,就算代码多漂亮,每个模块多精致,也不会成为一个好的系统。 当然,做好流程分析并选择好项目设计方法,都需要在需求分析能力上具有足够的把 握。
第三,复用设计和模块化分解能力
这个似乎又是老调重谈,前面基本素质上不是已经说明了这个问题吗?
作为一个从事模块任务的程序员,他需要对他所面对的特定功能模块的复用性进行考虑,而作为一个系统分析人员,他要面对的问题复杂的多,需要对整体系统按照一种模块化的分析能力分解为很多可复用的功能模块和函数,并针对每一模块形成一个独立的设计需求。举个例子,好比是汽车生产,最早每辆汽车都是独立安装的,每个部件都是量身定做的,但是后来不一样了,机器化大生产了,一个汽车厂开始通过流水线来生产汽车,独立部件开始具有一定的复用性,在后来标准化成为大趋势,不同型号,品牌甚至不同厂商的汽车部件也可以进行方便的换装和升级,这时候,汽车生产的效率达到最大化。软件工程也是同样的道理,一个成熟的软件行业,在一些相关项目和系统中,不同的部件是可以随意换装的,比如微软的许多桌面软件,在很多操作模块(如打开文件,保存文件等等)都是复用的同一套功能模块,而这些接口又通过一些类库提供给了桌面应用程序开发者方便 挂接,这就是复用化的模块设计明显的一个佐证。
将一个大型的,错综复杂的应用系统分解成一些相对独立的,具有高度复用性的,并能仅 仅依靠几个参数完成数据联系的模块组合,是作为高级程序员和系统分析员一项最重要的 工作,合适的项目设计方法,清晰的流程图,是实现这一目标的重要保证。
第四,整体项目评估能力
作为系统设计人员,必须能够从全局出发,对项目又整体的清醒认识,比如公司的资源配置是否合理和到位,比如工程进度安排是否能最大化体现效率又不至于无法按期完成。评估项目整体和各个模块的工作量,评估项目所需的资源,评估项目可能遇到的困难,都需要大量的经验积累,换言之,这是一种不断总结的累计才能达到的境界。在西方一些软件系统设计的带头人都是很年长的,比如4,50岁,甚至更老,他们在编码方面已经远远不如年轻人那样活络,但是就项目评估而言,他们几十年的经验积累就是最重要和宝贵的财富。中国缺这么一代程序员,主要还不是缺那种年纪的程序员,而是那种年纪的程序员基本上都是研究单位作出来的,都不是从专业的产品化软件研发作出来的,他们没有能积累 那种产品化研发的经验,这也是没有办法的事情。
程序员应具备的素质下
第五,团队组织管理能力
完成一个项目工程,需要团队的齐心协力,作为项目设计者或研发的主管人,就应当有能 力最大化发挥团队的整体力量,技术管理由于其专业性质,不大同于一般的人事管理,因 为这里面设计了一些技术性的指标和因素。
首先是工作的量化,没有量化就很难做到合适的绩效考核,而程序量化又不是简单的代码 行数可以计算的,因此要求技术管理人员需要能真正评估一个模块的复杂性和工作量。
其次是对团队协作模式的调整,一般而言,程序开发的协作通常分为小组进行,小组有主 程序员方式的,也有民主方式的,根据程序员之间的能力水平差距,以及根据项目研发的 需求,选择合适的组队方式,并能将责权和成员的工作任务紧密结合,这样才能最大发挥 组队的效率。
一个代码水平高的人,未必能成为一个合格的项目研发主管,这方面的能力欠缺往往是容 易被忽视的。
综上可以看到,作为一个主管研发的负责人,一个项目设计者,所需要具备的素质和能力并不是程序代码编写的能力,当然一般情况下,一个程序员通过不断的总结提高达到了这种素质的时候,他所具有的代码编写能力也已经相当不简单了,但是请注意这里面的因果关系,一个高水平的项目设计者通常已经是代码编写相当优秀的人了,但是并不是一个代码相当优秀的程序员就可以胜任项目设计的工作,这里面存在的也不是智商和课本的问题,还是在于一个程序员在积累经验,逐步提升的时候没有意识到应当思考哪方面的东西,没有有意识的就项目的组织和复用设计进行揣摩,没有经常性的文档习惯和总结习 惯,不改变这些,我们的合格的项目设计者还是非常欠缺。
另外,为防止有无聊的人和我较真,补充一点,本文针对目标是作商业化的软件项目和工程,那些科研机构的编程高手,比如算法高手,比如图象处理高手,他们的工作是研究课题而非直接完成商业软件(当然最终间接成为商业产品,比如微软研究院在作的研究课题),因此他们强调的素质可能是另外的东西,这些人(专家),并不能说是程序员,不 能用程序员的标准去衡量。
最后补充一点东西,一个软件项目研发的设计流程是怎样的呢?以通常标准的设计方法为 例,(不过笔者喜欢快速原型法)。
第一个步骤是市场调研,技术和市场要结合才能体现最大价值。
第二个步骤是需求分析,这个阶段需要出三样东西,用户视图,数据词典和用户操作手 册。
用户视图是该软件用户(包括终端用户和管理用户)所能看到的页面样式,这里面包含了 很多操作方面的流程和条件。
数据词典是指明数据逻辑关系并加以整理的东东,完成了数据词典,数据库的设计就完成 了一半多。
用户操作手册是指明了操作流程的说明书。
请注意,用户操作流程和用户视图是由需求决定的,因此应该在软件设计之前完成,完成 这些,就为程序研发提供了约束和准绳,很遗憾太多公司都不是这样做的,因果颠倒,顺 序不分,开发工作和实际需求往往因此产生隔阂脱节的现象。
需求分析,除了以上工作,笔者以为作为项目设计者应当完整的做出项目的性能需求说明 书,因为往往性能需求只有懂技术的人才可能理解,这就需要技术专家和需求方(客户或 公司市场部门)能够有真正的沟通和了解。
第三个步骤是概要设计,将系统功能模块初步划分,并给出合理的研发流程和资源要求。作为快速原型设计方法,完成概要设计就可以进入编码阶段了,通常采用这种方法是因为涉及的研发任务属于新领域,技术主管人员一上来无法给出明确的详细设计说明书,但是并不是说详细设计说明书不重要,事实上快速原型法在完成原型代码后,根据评测结果和 经验教训的总结,还要重新进行详细设计的步骤。
第四个步骤是详细设计,这是考验技术专家设计思维的重要关卡,详细设计说明书应当把具体的模块以最’干净’的方式(黑箱结构)提供给编码者,使得系统整体模块化达到最大;一份好的详细设计说明书,可以使编码的复杂性减低到最低,实际上,严格的讲详细设计说明书应当把每个函数的每个参数的定义都精精细细的提供出来,从需求分析到概要设计到完成详细设计说明书,一个软件项目就应当说完成了一半了。换言之,一个大型软 件系统在完成了一半的时候,其实还没有开始一行代码工作。
那些把作软件的程序员简单理解为写代码的,就从根子上犯了错误了。
第五个步骤是编码,在规范化的研发流程中,编码工作在整个项目流程里最多不会超过1/ 2,通常在1/3的时间,所谓磨刀不误砍柴功,设计过程完成的好,编码效率就会极大提高,编码时不同模块之间的进度协调和协作是最需要小心的,也许一个小模块的问题就可能影响了整体进度,让很多程序员因此被迫停下工作等待,这种问题在很多研发过程中都出现过。编码时的相互沟通和应急的解决手段都是相当重要的,对于程序员而言,bug永远存在,你必须永远面对这个问题,大名鼎鼎的微软,可曾有连续三个月不发补丁的时候 吗?从来没有!
第六个步骤是测试
测试有很多种:
按照测试执行方,可以分为内部测试和外部测试
按照测试范围,可以分为模块测试和整体联调
按照测试条件,可以分为正常操作情况测试和异常情况测试
按照测试的输入范围,可以分为全覆盖测试和抽样测试
以上都很好理解,不再解释。
总之,测试同样是项目研发中一个相当重要的步骤,对于一个大型软件,3个月到1年的外 部测试都是正常的,因为永远都会又不可预料的问题存在。
完成测试后,完成验收并完成最后的一些帮助文档,整体项目才算告一段落,当然日后少 不了升级,修补等等工作,只要不是想通过一锤子买卖骗钱,就要不停的跟踪软件的运营 状况并持续修补升级,知道这个软件被彻底淘汰为止。
写这些步骤算不上卖弄什么,因为实话讲我手边是一本《软件工程》,在大学里这是计算机专业的必修课程,但是我知道很多程序员似乎从来都只是热衷于什么《30天精通VC》之类的,他们有些和我一样游击队出身,没有正规学过这个专业,还有一些则早就在混够学 分后就把这些真正有用的东西还给了老师。
网上现在也很浮躁,一些coding fans乱嚷嚷,混淆视听,实际上真正的技术专家很少在网上乱发帖子的,如笔者这样不知天高地厚的,其实实在是算不上什么高手,只不过看不惯这种对技术,对程序员的误解和胡说,只好挺身而出,做拨乱反正之言,也希望那些还 沉迷于一些错误人士的coding fans们能认真想想,走到正途上,毕竟那些聪明的头脑还 远远没有发挥应有的价值。