首页
归档
友情链接
关于
Search
1
在wsl2中安装archlinux
80 阅读
2
nvim番外之将配置的插件管理器更新为lazy
58 阅读
3
2018总结与2019规划
54 阅读
4
PDF标准详解(五)——图形状态
33 阅读
5
为 MariaDB 配置远程访问权限
30 阅读
心灵鸡汤
软件与环境配置
博客搭建
从0开始配置vim
Vim 从嫌弃到依赖
archlinux
Emacs
MySQL
Git与Github
AndroidStudio
cmake
读书笔记
菜谱
编程
PDF 标准
从0自制解释器
qt
C/C++语言
Windows 编程
Python
Java
算法与数据结构
PE结构
登录
Search
标签搜索
c++
c
学习笔记
windows
文本操作术
编辑器
NeoVim
Vim
win32
VimScript
Java
emacs
linux
文本编辑器
elisp
反汇编
OLEDB
数据库编程
数据结构
内核编程
Masimaro
累计撰写
308
篇文章
累计收到
27
条评论
首页
栏目
心灵鸡汤
软件与环境配置
博客搭建
从0开始配置vim
Vim 从嫌弃到依赖
archlinux
Emacs
MySQL
Git与Github
AndroidStudio
cmake
读书笔记
菜谱
编程
PDF 标准
从0自制解释器
qt
C/C++语言
Windows 编程
Python
Java
算法与数据结构
PE结构
页面
归档
友情链接
关于
搜索到
2
篇与
的结果
2020-06-13
记一次失败的项目经历
最近因为疫情原因一直在家,已经有快半年没有更新博客了,最近返回公司上班之后,去年做的项目已经完结,虽然已成功交付用户使用,但是在我看来这仍然是失败项目,在这里我想回顾这些经历,算是给后面的自己一个警醒吧为何说这是一个失败的项目我一直认为这是一个失败的项目,原因有如下几点:项目为能如期交付,原定计划是在2月份交付并发行1.0稳定版,但是由于种种原因推迟到了6月1号,延期了快半年项目到后期难以维护,在后期代码复杂度上升了不止一个层次,给维护与扩展带来了不小的麻烦项目质量无法达到预期效果,在发布之时仍有部分隐藏bug,没有经过细致的测试,为了按时交付,很多测试工作都省略了,目前只进行了两轮测试。功能有些无法达到预期效果,当初为了赶进度很多不重要的功能也是能省则省,有些需求并没有很好的实现项目中存在的一些问题前期需求设计不合理:早期立项的时候,我参考了许多类似的产品、与相关同事进行过探讨,但是由于经验不足,没有相关产品的开发与使用经验,导致许多需求设计不太合理,后续变更需求频繁,甚至出现过回炉重造的情况,这个主要责任在我这边,当时很多需求是我自己一拍脑门想起来觉得这样做可能符合客户需要,但是没有跟其他人进行商量,导致在后续实施时要么是在此基础上无法实施,或者成为鸡肋功能影响后续工作。后续需求变更频繁:后续需求变更频繁,很多时候老板看过项目之后觉得哪块不好会直接提出来,比如某些功能不合理,某些地方配色,页面布局不合理之类的。测试人员会在测试实际使用中告知他们想要某个功能,以便更方便的使用与测试。但是这些变更往往是在后期开发已经完成,正式进入测试流程中时提出,给后续开发与维护造成很多不必要的麻烦。这种情况的主要问题在于老板与测试人员在早期需求制定时参与过少,以及我本身对这方面不够专业。导致出现后期疯狂修改需求的情况需求记录不及时:在前期需求设计时我会详细记录需求的相关内容与演示效果,但是后续开发任务紧张,需求变更频繁,无法有充足的时间进行需求变更的记录,很多时候都是老板或者测试人员口述,然后由开发人员进行修改,没有合理的需求评审,没有详细的记录,有时候时间一长自己都给忘了当初是如何制定的。后续无法复盘架构设计问题:还是由于自己当初经验不足,当时考虑到用户可能需要二次开发,所以规定当时所有的功能都采用restful-API的形式,并且前端采用纯粹的ajax请求直接调用后台接口,但是有些功能确实不太适合做成接口,而且对于前端大家都不了解的情况下没有使用常用的前端界面框架,而纯粹采用自己编写的方式造成大量的时间浪费与遗留无法解决的bug。这些都给项目造成了不小的麻烦;没有详细设计:当初项目留给前期设计的时间并不充足,按照一般软件功能的流程来说,重要的时间应该留给前期设计,编码与测试只占极少数部分,而在这个项目进行过程中,完全颠倒过来了,不到一个月完成前期的需求与详细设计以及开发测试的分工,和接近3个月的开发与测试。导致的结果就是代码臃肿,很多公共功能没有抽象为具体的函数,重复代码过多,代码结构混乱无法进行后续维护。也就是说我们项目一开始就早就出了一个屎山。分工不合理:在前期设计与开发环境框架制定完成之后,进入到分工环节,在这个环节中出现分工不够合理的问题。主要体现在我自己不清楚员工的能力与擅长的部分,在制定计划时采用平均分配的方式没有考虑需求难度与员工自身的能力相结合。导致后续能力强的员工快速完成任务而存在空闲时间,而能力一般的往往会拖慢进度,或者对于困难需求实现的也是差强人意。或者出现能力强的员工去帮助能力一般的员工完成剩余需求,出现能者多劳但是无法多得的情况。测试与验收问题:在早期设计阶段并没有完整的测试计划,测试一直推迟到开发完成之后,在那个时候发现想要详细测试时间不够、测试出来的bug由于设计等原因难以修改、甚至出现某些地方使用不太合理又要新加需求的情况,这些都导致无限期的加班与代码修改,代码越改越乱,人心烦躁,开发与测试怨声载道。后续该如何改进培养自己的产品思维:早期需求制定的不合理,我自身有很大的原因,我由于本职工作是做开发的,很多时候在设计需求时采用的是开发者的思维方式,而没有站在用户角度,设计出来的系统在后续测试中会发现很难用,没有合理的引导,功能过于分散,常用功能操作不够简单,操作步骤过多等情况时有发生,为了用户必须得改需求。我想自己得加强这方面的素养,设计完成之后少改需求制定规范的需求管理制度:在需求制定、变更、实现、验收这些过程,在项目中没有与很好的得到解决和管理,造成很多需求后续无法查证,不合理的需求无法定位到具体的责任人,甚至谁都可以提需求。为了解决需求相关的问题,需要引入规范的需求管理制度,加入需求评审等操作,让需求更合理,更有迹可循。延长早期设计时间:在大学中学习软件工程相关课程时,我的老师告诉我,在项目开发中,编码只占很少一部分,而现在似乎反过来了,编码占据了时间的大头,而前期设计只是为了给开发人员安排工作而已。我想一个成功的项目应该是会在前期设计过程中下了很大的功夫的。可以在前期多进行相关会议,比如需求评审、针对需求进行测试用例的评审、开发框架与相关方案的评审、以及工作计划的合理安排等等。规范开发中的代码审查机制:员工的能力,与代码编写风格对项目的可维护性有巨大的影响,过去我一直觉得开发人员应该保留自己的个性,编写能体现能力的牛X的代码,但是经过几次与他人合作、带领团队开发项目之后,我改变了这个看法,作为底层的码农,为了项目的统一于可维护性,最好还是安心做一颗螺丝钉,多人合作不需要个性,一切为了项目才是正道。所以在后续如果还有项目需要我带队开发,我会统一编码格式与注释格式,像大厂那样制定编码规范,甚至细微到如何给变量、函数、类命名等等。最好每天下班前一次 code review,及时消除冗余代码、不规范的代码、不合理的功能,特别是同一个功能,多个人编写函数,函数的参数列表与实现完全不同的情况。测试与开发并行的机制:之前测试永远是等到所有开发任务完成之后进行,一旦项目完结,进入维护节点,要修改bug是相当困难,而且是牵一发而动全身的,测试应该与开发并行,在需求评审时应该做到给出需求验收标准与对应的测试用例,而且需要配合代码审查,提醒开发人员针对每一个功能函数编写单元测试。需求完成之后立即对照测试用例进行测试,保证每个需求都准确无误。更加合理的工作安排:合理安排工作,需要做到针对员工的能力和需求评审时得出的需求的难度来合理安排,合理安排包括合理的时间、合理的人员与合理的需求安排等等。这个可能没有相应的参考标准,只能根据经验来判断了。自己应该更加投入到这个项目中:由于我在公司待的时间较长,对公司业务比较熟悉,所以很多时候总有人会来问问题、商量某些事,我一贯又是一个老好人的态度,甚至有时候做到事无巨细都亲自动手。甚至公司主要产品也需要我来进行维护,而且由于项目人手不够,我也参与到项目的具体开发与测试工作之中,导致长时间都消耗在无意义的事情之上,无法专注于项目管理工作上。在后面项目需要做需求变更、更改开发计划时无法及时记录与评审;看到不合理的代码没有时间做code review、提取公共部分,重构部分代码,这些工作都由于没有时间而暂时搁置了。在后面项目越发的超出我的掌控。以上就是之前带队开发时出现的问题以及一些反思,如果后面还有机会作为项目的leader,我想尽量避免这些情况。更加专注于项目。制定相关制度,保证项目质量。
2020年06月13日
4 阅读
0 评论
0 点赞
2018-08-19
毕业两年的反思
以下内容都是在醉酒状态下写的,各位就当看个热闹吧,千万不要当真,要真能给您一些启发那就谢天谢地了。到今年6月份,已经毕业两年了,在这两年中换过一家公司,从银行外包到安全行业,经历过加班,也经历过无所事事,心中有些感慨和想法与大家分享时间真的是不等人,之前刚入行时我也是由一位老大哥带着做项目,那个时候我差不多是项目组年龄最小的,而如今在现在的公司中,我成了唯二的老员工,我从去年入职现在的公司到现在公司经历了一轮大的换血,老员工差不多都走了,而现在我也从当初的被别人带转换了角色变成了带新人,新员工都是刚毕业的大学生,有志向,有抱负,有的也有能力,跟他们一比,真的有种长江后浪推前浪的感觉。心中不免有些惆怅,原来一年一年的混日子,时间过的这么快。现在我真正理解了作为程序员必须的具备终身学习的能力。以及那种随时都有可能被新人给淘汰掉的危机感第二个就是不能对技术太过于执着,现在很多程序员包括我在内总是唯技术,好像一些产品里面用了某种牛逼的技术那它就值钱,就牛逼。其实真的不是这样的,技术是为需求服务的,再好的技术也是为了解决现实中的问题,只要能解决现实问题就算你用最low的算法,它也是一个好的产品。从这个角度来说,一个程序员的薪资水平跟他自身的技术水平并不是正相关的关系,薪资水平高低在于他能够利用手中的技术为公司带来多大效益或者说它能为多少人产生多大的价值。技术就是这样没有最好的,也没有最坏的,没有什么所谓的最前言,也没有什么淘汰之说,只有最合适它的平台,就拿汇编来说,很多地方的确用不上汇编了,但是在某些场合,比如说做安全进行HOOK的时候可能会需要,或者在一些对性能有着变态需求的地方,有的实在不能再优化了,只有将C代码改为对应的汇编代码。没有最好的技术只有最合适的技术既然说到终身学习,那么下面就来说说程序员学习的事。学习首先得找一个方向,也就是经常说的职业规划,一般来说刚入行的程序员可能并不知道自己该从事何种方向,就知道一心写代码,公司让干啥就干啥,公司有啥业务就学啥业务。确实一般刚入行的新人可能对整个行业没有一个整体的把握。我觉得入行后可以花1到2年的时间来关注业界相关新闻,不断跳槽以便接触更多方向,然后从中选择一个适合自己的或者自己真正喜欢的方向,随后自己的精力需要完全投入到这个方向上来,学习的路线也应该围绕着这个方向来进行。比如说我现在从事Web安全的开发,刚开始也是什么都不懂,XSS、SQL注入等等完全不了解,这些涉及到的是Web的相关知识,因此针对这点我自己给的学习路线是,首先学习HTML、CSS这些前端的相关知识,然后学习Web开发、了解常见的一些框架和开发语言,比如PHP、Java等等,公司主要做的是一款扫描器,而扫描器中很重要的一个部分是爬虫,现在爬虫一般流行用Python,因此我又顺便学习了Python的相关内容,而扫描器用来检测漏洞的一些POC都是用Python写的,这样也必须的学习Python。而Web又是基于HTTP协议的因此必须得学习HTTP协议,顺便可以学习TCP/IP协议的整个架构。因此这样很容易就能理出一条学习的线路来。所以说在后续学习的时候需要找出自己真正喜欢的方向(不一定是喜欢,但是必须是自己不讨厌的),了解一下这个方向的主要内容,从中找出自己的不足来进行针对性的学习。然后可以尝试着利用学到的知识写点小工具等等,比如我自己常常使用Python搜集一些网上的POC来集成到自己的程序中用来制作简单的漏洞探测工具。我感觉现在整个IT行业存在一个浮夸、焦躁的环境。经常就是过段时间有一个新技术出来,然后大量的关于新技术的课程,文章,以及大量的招对应的开发人员,看着薪水好像挺高,似乎这个技术就是未来,其他的技术都过时了,而我们程序员很容易被这种风气给带歪了,他们会花时间去学习新技术,然后跳槽,然后从简历上看他似乎什么都做过,前端火的时候他是一个前端程序员,后来Python全栈火了,他又成了全栈,然后大数据火了,他又做大数据去了,而现在AI火了,然后他现在是一个AI的开发人员,似乎他什么都会,但是后来发现就一个调用框架然后复制粘贴。当然我不反对学习新技术,学习新技术应该与应用相结合或者说与现实中的问题相结合,比如做扫描器经常会有误报,怎么消除误报呢?AI是不是一个好方法,能不能用机器学习来减少误报?如果可行,那么就可以考虑去学习一下。还有我们如何从海量的日志信息中找出具有攻击行为的那些日志?这个可不可以利用大数据来进行检索?利用机器学习来准确识别?我觉得这才是学习新技术的真正原因,而不是光看重新行业的薪水。还是前面说的技术是为需求服务的,学习也是一样的,为现实中具体的需求来学习。归根到底,学习应该是为了用新技术来解决现实问题。在这两年中,我越来越觉得基础知识的重要性,当初在学校时总觉得很多东西会用就行,不需要纠结它的细节,什么快速排序,二叉树等等这些都有现成的库函数,没必要去了解它们,所以没有好好学习这些内容。现在看来这种看法很有问题,学习基础就好像当时很多人嘲讽买菜不用微积分那样觉得生活中用不到它们。现在也有很多人跟我说过,学习那些算法没有用,这些都由老外在写,人家那么大的组织机构来维护,你自己写的肯定效果上没有别人的好,到时候会用就行。但是我想如果作为一个程序员如果只是把自己限制在使用别人的库,只会复制粘贴别人的代码,这样永远是一个底层的码农,而做不了真正的程序员,还是那句话让它服务于具体的应用,比如你学习了HTTP协议之后,能不能仿照它,做一个能在嵌入式设备中使用的微型的HTTP服务器而不是直接上Apache,或者我能不能利用它的设计思想来提供类似的功能。而不是说为了使用HTTP而使用,学习这些算法与基础的意义并不在于会用别人写的库,而在于根据具体的情形选择并设计编写出适当的代码。或者能更好的使用这些开源库,而不是仅仅把别人demo的东西照搬过来。在当今互联网时代,学习东西比过去方便了许多,但是互联网也有许多问题,第一个就是互联网上资源太丰富了,以至于想学一个课程但是找不到合适的,比如说我想学下C语言,你会发现网上一大片C的内容,有视频有博客还有电子/实体书,但是各种资源的质量良莠不齐,很难抉择。经常听到有建议说自学能力强的选择看视频或者看书,但是对于初学者来说很难分辨一个资源的好坏,我当时自认为自学能力很强,在大学期间找了各种视频,看了各种书,吃过很多亏走过很多弯路,才学会了点C的皮毛,经常就是一个视频看完了,感觉基础学会了,想找一些实践的东西,然后发现很多都是前面一点快速把基础过一遍,然后开始做项目,最后发现跟着视频项目做出来了,但是并没有学到什么东西,反倒是丢了视频好像什么都不会,然后就会产生一定的挫败感。我自己当时也是被虐到怀疑人生也常常在思考我是不是适合这个行业。但是好在我从来没有在我应该学习C/C++这条路上产生过怀疑。说到这里,我想说说我对培训机构的看法,现在很多人说到培训机构总是一副喊打喊杀的语气,好像培训机构毁了整个IT行业。其实培训机构很不错的,他至少能带你入门,我们常说师傅领进门,修行在个人。跟着培训机构就好像有一个前辈一直在带你,给你分享他的见识,分享他的思路,而且培训机构能让你快速融入这个圈子,毕竟你的同学老师都是从事这个行业的。从这个角度来看好的培训结构能使你受用终身。每个行业都有好有坏,不要一杆子打倒一片。但是一般包就业,并承诺薪资的一般是坑。互联网的另一个坏处就是造就了一批伸手党,他们混迹于各大论坛,QQ 群,经常就是甩出一段代码然后告诉你这个跟他想的不一样,该怎么改。最可恨的是有的还给的是截图,你想给他调都没办法,难道要别人一个一个的照着敲,拜托大家都很忙好吧。其实很多问题都是你自己单步调试一下就可以解决的,很多人就是不愿意,一句我是初学者,我不会,所以你帮我看看,一般像这种看了真的是让人火大;另外一种人就是自认为是大神的,经常有初学者提问说,我想学下XXX,请问该怎么学,这个时候总有那么几个大神会告诉人家,你学这个没用,还不如去学XXX,或者说这个不用学,有现成的代码,然后甩一个连接给段代码,这种人也是令人火大的,人家初学者想学一个东西,你没有系统的学过就不要回答了,我觉得这样完全是误人子弟。所以你看:现在互联网虽然方便,但是学习的路并似乎没有变得轻松,它只是以另一种形式增加了你学习的成本而已,过去很多东西报个班或者找个老师花点钱就给你讲明白了,但是现在互联网时代很多人觉得资源应该共享,应该免费。但是从某种程度上学习成本其实基本没变,而且是以一种无形的成本来体现出来的,通常这种成本是最难发觉的,可能对你造成的误导是最深的。以上都是本人的一些突发奇想,写这些的时候是跟以前的同学一起喝过酒的,很多地方都有点胡言乱语的意思。请各位见谅。。。。。
2018年08月19日
7 阅读
0 评论
0 点赞