㈠ 一名996程序猿的一天,是如何度过的呢
其实程序员在上班的时候并不是一直都坐在电脑前,写编程需要有一定的灵感,所以程序员很多时间都用在了思考上。程序员最痛苦的事情就是无止境的加班,每当有什么活动的时候,程序员就必须加班都凌晨,甚至是平时也经常是深夜下班,第二天照常得早起上班。
程序员加班已然是常态,程序员对996的反抗,也并非一开始就有。一位阿里的员工回忆,最早开始施行996时,通常是遇到淘宝大促等特殊时期,为了保证项目按时上线、抢购当天运转顺利,开发团队需要连续加班月余甚至数月,但在当时,每每项目结束,程序员们往往颇有成就感,随后到来的一段“闲时”,也可以让员工恢复体力。
㈡ 为什么培训出来的程序员会被广受诟病
近两年与传统行业的逐渐衰落(房地产除外)形成对比,互联网行业的爆发式兴起。越来越多的资本也开始从过气的行业中抽离出来,融入到互联网行业中。从2009年以来智能机的兴起,催生互联网进入移动互联时代。从前几年的android,ios app,html5,到百团大战,网络金融,再到直播绽放,再到AI技术,再到现在饱受争议的区块链技术,随着这些技术封口的发展,诞生了非常多的独角兽企业,与此同时也为大量互联网从事者提供了大量的就业机会。
大的不行,基础又被视为不过关,先自我尴尬10秒。所以不管怎么说,自学或者培训出来的程序员的确是会有一些缺陷存在。不过不要气馁,因为你总会通过自己的努力找到属于你自己的位置的。我相信,我们热爱编程开发的人是不会太差的。
㈢ 4月程序员实训报告3000字
一、实习的目的和意义
进大学生活的最后一个年头,站在我们面前的就是那个向往已久的工作社会,所以我们的心可以说是既高兴又兴奋,因为我们终于可以在这个巨大的舞台上展现自我,但我们还需要时间去了解这个社会。为此我选择了实习,其目的在于通过实习使我们自己获得基本操作的感性知识,理论联系实际,扩大知识面;同时专业实习又是锻炼和培养学生业务能力及素质的重要渠道,培养我们当代大学生具有吃苦耐劳的精神,也是学生接触社会、了解产业状况、了解国情的一个重要途径,逐步实现由我们学生到社会的转变,培养我们初步担任技术工作的能力、初步了解企业管理的基本方法和技能;体验企业工作的内容和方法。这些实际知识,对我们学习后面的课程乃至以后的工作,都是十分必要的基础。
二、实习内容
我的工作岗位是软件开发工程师实习,就是程序代码的编写。
当我们进入一个企业,进入一家公司时,首先先要对该公司的概况有一定的了解,并对该公司所开发的项目有一定的认识,我们需要去慢慢的熟悉流程,熟悉业务。刚开始两天就是自己在公司看看文档,并熟悉环境。指导我的是一位年纪大一、二岁的同事,先与我说了一下要点,然就让我自已看,遇到不懂的就问。只有我们接触这种企业公司,才会真正的知道一个企业的项目之大,刚开始令人看了眼花缭乱,看一会就会晕,有几百个表,有几千个类,一个页面好几千行代码。甚至更多。这刚开始我就熟它的大致结构。一开始什么都不懂,也不懂业务。令我感动的是每当我我有一点不明白的地方,他都会不烦其劳的与我讲清楚,直到我弄明白为止。在我坚持不懈的努终于适应了变化,他的脸上也有了笑容。
两天之后,熟悉了基本框架,基本流程之后,我也成为工作之中的一员,开始试着去写代码,去改bug,去写一些新的小模块。在这一段时间里,主要任务有巩固之前所学的,对常见的错误要一看即知,并养成认真仔细的工作作风。在
其后的工作中我都有保持谦虚的心态。在种状态下我进步很快,花了比别少了将近一半的时就达到目标了。
在这个项目中我们前端用的是Ext框架,它具有友好的界面功能。让我们做起来更简单。在前端我们通过控件中的属性和在Spring里配置好的id值,可以去调用业务中的方法,业务中方法又可以去调用底层实现的方法,或者我们已包装好的方法。最后是底层的方法去调用数据库中的数据以呈现我页面上。
在这个项目中我们用的环境是eclipse,数据库是Oracle。主要的框架技术在前台用的是Ext框架,后台用的是Hibernate+Spring,用的MVC模式,包结构非常清楚,在每个包里边都包括四部分,实体类,接口,接口的实现类,还有流序列化。在Web部分也是如此,也都有对应的包,对应的jsp去调用对应的js。那么接下来我就对这几分部分作一个讲解吧。首先是Ext框架,ExtJS是一种主要用于创建前端用户界面,是一个与后台技术无关的前端ajax框架。ExtJS可以用来开发RIA也即富客户端的AJAX应用,是一个用javas cript写的,因此,可以把ExtJS用在、Java、Php等各种开发语言开发的应用中。ExtJs最开始基于YUI技术,由开发人员JackSlocum开发,通过参考JavaSwing等机制来组织可视化组件,无论从UI界面上CSS样式的应用,到数据解析上的异常处理,都可算是一款不可多得的JavaS cript客户端技术的精品。JQuery、Prototype和YUI都属于非常核心的JS库。虽然YUI,还有最近的JQuery,都给自己构建了一系列的UI器件(Widget),不过却没有一个真正的整合好的和完整的程序开发平台。哪怕是这些低层的核心库已经非常不错了,但当投入到真正的开发环境中,依然需要开发者做大量的工作去完善很多缺失之处。而Ext就是要填补这些缺口。
其次是Hibernate,Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序实用,也可以在Servlet/JSP的Web应用中使用,革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
最后是Spring,Spring是一个解决了许多在J2EE开发中常见的问题的强大框架。Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯。Spring的架构基础是基于使用JavaBean属性的
InversionofControl容器。然而,这仅仅是完整图景中的一部分:Spring在使用IoC容器作为构建完关注所有架构层的完整解决方案方面是独一无二
的。Spring提供了的数据访问抽象,包括简单和有效率的JDBC框架,极大的改进了效率并且减少了可能的错误。Spring的数据访问架构还集成了Hibernate和其他O/Rmapping解决方案。Spring还提供了的事务管理抽象,它能够在各种底层事务管理技术,例如JTA或者JDBC事务提供一个一致的编程模型。Spring提供了一个用标准Java语言编写的AOP框架,它给POJOs提供了声明式的事务管理和其他企业事务--如果你需要--还能实现你自己的aspects。这个框架足够强大,使得应用程序能够抛开EJB的复杂性,同时享受着和传统EJB相关的关键服务。Spring还提供了可以和IOC容器集成的强大而灵活的MVCWeb框架。
三、实习心得
实习期间给我的感受:收获+喜悦。这实习将来给我们留下的不仅仅是回忆,因为他使我们的自身价值得到了提高。
“天下英雄皆我辈,一入江湖立马催。”从学校到社会的大环境的转变,身边接触的人也完全换了角色,老师变成老板,同学变成同事,相处之道完全不同。在这巨大的转变中,我们可能彷徨,迷茫,无法马上适应新的环境,但在同学、同事的帮助和自己摸索的情况下,逐渐适应了。但我发现,以我们的经验,不学到一定的深度和广度是难以在实际工作中应付自如的。因此反映出学习的还不够,缺点疏漏。需在加以刻苦钻研及学习,不断开拓视野,增强自己的实践操作技能。
四、实习总结
通过这次实习,有接下来的几点认识。
1、对于一个项目来说,良好的文档是正规研发流程中非常重要的环节,作为代码程序员,我们很多工作时间都是在写技术文档,它会在未来的升级以及模块的复用时起着至关的作用。所以我们必须注重这个。
2、良好的代码编写习惯也是非常重要的,它不但有助于代码的移植和纠错,也有助于不同技术人员之间的协作。我们要使我们的程序具有易读性,易扩展性,容错性。
(1)易应有尽有性:所有的变量和函数以及类名都用简单易懂易记忆的命名方式,所有类和函数,变量都有关键的注释说明。这点很重要,也很基础。
(2)易扩展性:整体系统架构逻辑简单清晰,模块与模块之间尽量做到互不影响,也就是尽可能的独立,这部分工作主要体现在前期设计工作中,需要掌握好的设计经验和方法才能够做的比较好。
(3)容错性:对所有数据都进行有效性检查:对第三方接口的调用失败的容错性。对所有代码都做调用失败后的处理。以及在大的工程中加入trace文件输出,把关键的操作信息输出,以便对工程异常情况产生条件的定位,及时解决问题。
3、一个好的调试、跟踪与测试方法是非常重要的。我们需要对每个模块的接口做测试,数据界的检查,在对整个模块做测试。主要测试稳定性,效率及功能是否正常。确认单个模块完全,再加入工程。我觉得在我们调试时用debug模式启动服务器是一个非常好的选择,我们可以很快定位到出错的地方。并用可以找到解决的办法。
总之这一段实习的经历让我明白了:一个优秀的程序员必须不断的学习,随时总结,找到自己的不足,这样逐步提高,才能让自己很快的成长起来。
篇二
通过实习,我自身发生了重大的转变。首先,进入公司,你就是一名职业人,不再是一名学生,你要具备一名职业人应具备的素养,不迟到不早退是必然的,而且还要时刻严格要求自己,公司的规定要严格遵守。其次,实习期间,我对项目的开发有了一个较完整的了解和熟悉。在实习过程中,我学到了许多在学校学不到的知识和技巧,学习了很多公司自己的框架和工具,这都是一些前辈的宝贵经验。再次,个人日语水平有了长足进步,对日后生活工作颇有裨益。
一、实习目的
通过实习,培养综合运用Java语言的面向对象编程能力;培养动手能力;培养良好编程规范、编程方法;以便能较全面地理解、掌握和综合运用所学的知识,提高自身的编程能力;增强自己的团队协作意识,了解软件开发的思考角度和主要流程。通过理论与实际的结合、学校与社会的沟通,进一步提高自己的思想觉悟、业务水平,尤其是观察、分析和解决问题的实际工作能力,以便培养自己成为能够主动适应社会主义现代化建设需要的高素质的复合型人才。为毕业之后能够更快地进入工作状态并且能够更好的工作,打好一定的基础。
二、实习单位基本情况介绍
xxxx有限公司,是一家由日方注资,专注于面向中国丰田汽车的软件开发设计、受托日本xxx信息系统株式会社开展系统开发,系统维护、面向中国的日资企业开展系统开发,以及面向中国国内的软件开发设计的IT企业。公司成立于2005年8月12日,注册资金RMB2,000,000元(xxxx系统株式会社100%投资),2006年04月04日成为xxxx信息产业协会会员;2006年05月25日成为xxx软件输出联盟会员;2006年05月30日被认定为xxx科技企业;2007年09月25日通过双软认定(软件企业认定、软件产品认定)。xxxx信息一直秉承软件提高效率、与社会共创信息化新时代的理念,致力于为用户提供具有自主知识产权的系统软件、安全软件、平台软件、各类应用软件以及全方位的解决方案和相关服务。
三、实习内容
1.日语培训
由于公司为日资企业,日常工作要求职员使用日语,因此,公司特从日本请来中原先生为我们做培训。大家零基础开始,每天有两到三个小时的学习时间,每周一参加语言阶段性测试。过程虽然比较艰难,但是效果显着,目前基本工作语言可用日语交流。
2.Java实训
通过本次实习,我对Java语言的各种特性有了更进一步的体会:
①Java语言的语法与C语言和C++语言很接近,使得大多数程序员很
容易学习和使用Java。另一方面,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java语言不使用指针,并提供了自动的废料收集,使得程序员不必为内存管理而担忧。
②Java语言提供类、接口和继承等原语,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。Java语言全面支持动态绑定,而C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。
③Java语言支持Internet应用的开发,在基本的Java应用编程接口中有
一个网络应用编程接口()它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
④Java语言是体系结构中立的Java程序(后缀为java的文件)在Java平台上被编译为体系结构中立的字节码格式(后缀为class的文件),然后可以在实现这个Java平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。
⑤Java语言是可移植的,这种可移植性来源于体系结构中立性,另外,Java还严格规定了各个基本数据类型的长度。Java系统本身也具有很强的可移植性,Java编译器是用Java实现的,Java的运行环境是用ANSIC实现的。
⑥在Java语言中,线程是一种特殊的对象,它必须由Thread类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为Thread(Runnable)的构造子将一个实现了Runnable接口的对象包装成一个线程,其二,从Thread类派生出子类并重写run方法,使用该子类创建的对象即为线程。值得注意的是Thread类已经实现了Runnable接口,因此,任何一个线程均有它的run方法,而run方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为synchronized)。
⑦Java语言的设计目标之一是适应于动态变化的环境。Java程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java中的类有一个运行时刻的表示,能进行运行时刻的类型检查。
3.数据库实训——SQLServer2008
在此次实习中,与Web服务器相连的数据库采用的是大型关系数据库管理系统——SQLServer2008。它是基于客户机/浏览机模式的数据库管理系统;它支持ODBC、ADO等技术的应用,可无缝的与Windows2008Server和IIS集成,提供高效安全的数据访问服务;有利于整个系统管理规范化,使数据的完整性、安全性得到保证。
数据库设计实际上主要是所要处理的数据的表示方法和存储结构的设计。在采用数据库技术之前,这些工作分散在应用程序中进行;在采用数据库技术之后,这些工作可以通过数据库设计集中起来系统地进行。
进行数据库设计的首要任务是考虑信息需求,也就是数据库要存入什么样的数据。创建数据库并不是仅仅为了存储数据,更主要的目的是从中提取有用的信息。除了考虑数据存储什么数据外,还应考虑存取方式,也就是处理需求。即要根据用户提出的存取要求来设计数据模式和应用程序。
4.社会人教育社会人教育也可以称为职业道德教育,是指从事一定职业的人们在职业活动中所应遵循的道德规范以及该职业所要求的道德准则、道德情操和道德品质的总和。成功的大学生职业道德教育可以为大学生以后从事本职工作打下良好的职业道德基础,为他们从业后具备良好职业道德修养提供理论、知识、情感前提。因此公司对新职员开展了职业道德教育课程,主要课程包括职前职业道德教育,即通过教育使大学生自觉认识到自己将来所从事职业的社会价值,使他们深刻感受到自己肩负的社会责任和使命,确立正确的就业意识和择业取向;表现在将来的从业行为上,通过教育使他们热爱本职工作,尽职尽责地履行职业义务,有较强的敬业和奉献精神。
四、实习收获
此次毕业实习,我学会了运用所学知识进行软件开发,学会了如何跟同事进行合作沟通。积累了处理有关人际关系问题的经验方法。同时我体验到了社会工作的艰苦性,通过实习,让我在社会中磨练了自己,也锻炼了意志力,训练了自己的动手操作能力,提升了自己的实践技能。积累了软件开发的经验,为以后工作也打下了很好的基础。实习是为将来打基础的重要阶段,珍惜自己每一个工作的机会,不论什么人,什么学历,从事什么工作,好好的表现、展示自己的能力,不要错过好的机遇。没有一件事情是轻轻松松的,但每一件事都是让人成长的,经历一段过程,喜悦或是艰辛,尽管经历的方式不尽相同,但它的结果是相同的,我都会因涉事而成长。
㈣ 程序员当了小组长却表示很难受:没有权利,还要被骂,老火
对程序员而言,日常精力主要放在项目开发上。一些leader会在团队内提拔一两位程序员,作为小组长协助自己管理团队。对选中的小组长而言,这是一种认可,也是一次历练。
而最近,一位网友表示小组长的位置其实很难受。这位网友总结了三点成为小组长以后的工作。首先,虽然有小组长的头衔,但日常工作还是开发,并没有实际的管理权,只是协助管理,真正负责的还是leader;其次,因为分神到管理团队,没有足够的精力专精在技术上,不能像以前一样提升自己的技术;最后,也是最难受的一点,往上抗压,往下挨骂,往往得不到同事的理解。
不少网友对这位小组长的话表示认同:我也做过这种…怎么说呢…积攒了一点管理经验…但是没有人事权…没有绩效决定权。对初次接触管理的人呢压力很大,关键是他么的工资不多一毛,还要兼顾汇报和编码,事多;我就是这样,组员的锅我背,上面催促也是催我;你的角色可能只是替老板分担管理压力而已,随时都会被收回,并不构成实例职务。
我对此事的看法有所不同。
首先,这是一个好机会,为转型管理做准备。管理是一门艺术,是一个对于程序员来说完全不同的世界:不是以前的数字和字母,更多的是人与人的交往,是从工程能力向沟通能力以及思想上的变化。以小组长的身份提前接触并没有什么不好,反而益处多多。
其次,能够成为小组长,证明已经得到了leader的认可。从leader的角度,也在放权培养人。将军都是大头兵过来的,这是必经之路。
大家怎么看呢?欢迎留言讨论。
最后,给大家推荐一个**Java进阶内推交流群730379855**,不管你在地球哪个方位,不管你参加工作几年都欢迎你的入驻!(群内会免费提供一些群主收藏的免费学习书籍资料以及整理好的几百道面试题和答案文档!)
㈤ 如何成为架构师 7个关键的思考 习惯和经验
工作了挺久,发现有个挺有意思的现象,从程序员、高级程序员,到现在挂着架构师、专家之类的头衔,伴随着技术和能力的提高,想不明白的事情反而越来越多了。这些疑问有些来自于跟小伙伴交流,有些是我的自问自答,有些到现在也想不清楚,这篇文章就来写一写这些问题。
如何更高效的学习?
很多新人程序员一开始在学习上找不到方向,但我想在渡过了一段时间的新手期之后这类问题大多都会变得不再那么明显,工作的方向也会逐渐变得清晰起来。
但是没过多久,能了解到的资料就开始超过每天学习的能力,像是买了没看的书、收藏没读的贴、mark了之后再也没有关注过的文章越积越多,更别提每天面对各种技术分享或者微博里的新鲜玩意了。
大多数人每天能留给自己学习的时间有限,这个阶段如何提升学习效率就成了要解决的重点。
说说自己提升学习效率的心得,其实非常简单:体系化的学习。
我曾经很喜欢看一些博客或者是一些“看起来”比较通俗易懂的文章,每天在微博微信里刷到什么技术文章就mark下来,基本上几分钟就能读完。可一段时间下来,虽然读了不少东西,但是还是有种在原地打转的状态,并没有感受到有什么实际的提高。
最后实在忍不住,抱着厚书硬啃了一遍,突然有种豁然开朗的感觉:读书时自己学到的是一张完整的知识网络,每个知识点和其它内容相互联系和区别。这种全方位的理解比起一篇篇独立的文章,不知要高到哪里去了。
而读了一段时间书之后,渐渐原本不在一个体系之内的知识也会慢慢联系起来,比如说后端服务的开发,简单梳理一下,就成了这样:
在重复了几次痛苦的学习-梳理过程后,再去看一些独立的文章或者资料往往会事半功倍,因为能在体系内找到相对应的知识,甚至有时候一本书里一页只需要看一句话,点破那层窗户纸,就可以掌握新的知识。
你是怎么知道这些的?
工作中总是会遇到各种各样的问题,有几次把问题处理过程总结了一下,发了出来,之后就像滚雪球一样,有越来越多的小伙伴来咨询问题,比如说:
前一阵帮忙排查一个性能问题,系统压力稍微一大就会频繁Full GC,压力降低之后又恢复了。
某个小伙伴接入代码质量检查系统之后发现每次构建会报一个莫名其妙的错误,打不了包。
某次代码有bug,小伙伴跑来来问我git怎么才能回滚代码。
每次查完这种问题的时候,一些刚毕业没多久小伙伴们就会用一种崇拜的眼神看着我,然后大多会问:“你是怎么知道这些的?”
实际上,虽然我一直在不断的学习,但是面对工作中无穷无尽的新问题,大部分问题还是会命中我没有掌握的那部分区域。每次有人问到我不了解的知识时我都会非常开心:还有什么比带着问题学习更有效率的学习方法呢?
而且幸运的是,在建立了自己的知识体系的基础上,学习新的知识通常都能很快的上手,解决一个问题往往只需要多了解一个知识点而已。
举个例子,频繁Full GC的问题,以前查过很多次GC的问题,大多数是Java程序或JVM内存泄露问题,而这次内存没有泄露,GC吞吐量也正常,那么我只需要查一下如何查看一段时间内创建的最多的对象的方法就可以了。
回到刚才的问题,小伙伴们问我:“你是怎么学到这些的知识的?”
答案是:在你问我问题之后现学的。
架构师应不应该写代码?
似乎隔三差五就能看到一些关于架构师应不应该写代码的文章。我是属于写代码派,因为我本身就喜欢写代码。但是,当工作职责发生变化之后,如何保持写代码和其它工作之间的平衡就成了问题。
从个体效率上来看,我自己亲自写代码,和很多人相比没有什么绝对优势,甚至有些人码代码的速度比我还快一些。
但作为架构师,参与写代码还是会有一些不大不小的收益。
一般来说合格的程序员对于明确分配的任务会完成的很好,但是大部分情况下“架构”这个词意味着架构师并不会涉及太多细节,架构图和代码实现之间总还是有些距离,你无法保证所有人都会正确的理解你的设计,或者是程序员写代码时遇到障碍时会立刻想出足够优雅的解决方案。
之前写过一篇关于烂代码的文章 ,大部分烂代码并不是架构师的设计问题,如果程序员没能很好的理解设计或者是经验不足,往往会做出一些非常匪夷所思的东西。比如我见过刚毕业的程序员为了防止模块耦合而将耦合的代码又拷贝了一份,或者为了“优化性能”而尽量把所有逻辑写在一个函数里。
如果不能及时发现并改正这些问题,那么这些地方就会变成“正确的错误代码”,或者”不是我写的“代码,或者”我靠我也看过那段代码“之类足以被挂上耻辱柱的玩意。这种问题算是架构师的责任吗?作为一个视名声如命的架构师,我认为是的。
在我看来,写代码的架构师更像是在做后勤保障的工作:在代码中第一时间发现可能存在的问题,向其他人提出警告,或是给予其他人改进的意见,必要的时候或是给其他人演示一下正确的姿势。
大部分情况下我作为架构师并不需要揽下“核心模块”开发这种工作,毕竟我能调配的时间太零散了,效率难以保证,很多人在专注的情况下比我做的好很多,我只需要保持大局观需要适度参与就可以了。
总的来说,架构师和程序员在某些方面上有点像产品经理和用户的关系,大部分程序员并不会主动告诉你他们想要什么、哪里需要优化,甚至自己也不知道这些。想要做出好的产品,捷径之一就是跟用户做同样的事情。
实践:开会是个技术活吗?
我觉得应该没有人喜欢开会,身为一个程序员,没有几个人的志向是当什么职场交际花。
但是会议邀请就这么一个个的跳了出来:开发需求要跟产品开会、项目方案要跟技术开会、新人转正要去开评审会、别的公司来了几个大牛正在开分享会、出了故障要开总结会、小组有周会、部门有周会,大项目每周开两次碰头会不过分吧?小项目启动的时候开个会不过分吧?调试的时候发现有个坑大家赶紧讨论讨论吧?
有时候参加的会议整场下来跟我毛关系都没有,全程神游俩钟头,最后突然有人一拍桌子:”还有问题没?好,散了!“
也有可能有个什么会没叫你,过了俩礼拜突然收到封邮件催开发进度,”当时那个会你没参加,大家都说应该是你们做……你没看会议纪要吗?“
吐槽了这么多,但我还是认为开会是个技术活,对于架构师来说尤其如此。
大多数技术人员开会并不是那种新闻里的工作汇报或者长者们的会议,他们真的需要通过开会讨论一个具体方案,或者解决什么具体问题。可惜的是我参加过很多会议,大多数的会议都是在毫无意义的交流中浪费时间:几方人坐在一个屋里互相说一些对方理解不了的话,最后得出一个”我们会后再捋一捋“之类的结论。
这并不是会议才有的问题,在程序员日常的沟通中,也有很多人并不懂得如何交流,比如偶尔会收到一些写的非常认真的邮件,打开之后是密密麻麻的一屏幕文字,但是从第一句开始就不知道他在说什么,后面的东西连看的动力都没有了。
大多数时候,沟通的核心不是你说了什么,而是你想要让对方了解什么、让他做什么。良好的沟通能在工作中显着提升效率,但很多人忽略了这个事情。
想要恰到好处的进行沟通是一件不那么轻松的事情,但是简单来说有几条原则:
确保各方对背景的理解一致,比如开会之前先简单通过邮件交流一下,对新加入会议的人花个30秒钟做个前情提要,或者在讨论过程中让对方说一下他的理解。
去掉对方不能/不需要理解的内容,比如跟产品说“这个队列在高并发下因为锁的实现有问题导致CPU性能瓶颈”不如改成“我们发现了性能问题,持续10分钟了,10万用户收不到运营发的无节操广告,大概5分钟后扩容解决”。
确保在对方失去注意力前尽快说出重点,比如排查问题的总结邮件,如果第一段是这样:“某某框架内部使用的是xxx技术,这个技术的架构是这样:blabla”,那么对方可能完全不知道你在讲什么。可以换成这样:“我发现了某某框架的bug,需要尽快升级,否则在xxx情况下有可能会出现yyy问题,具体排查过程如下:blabla”。
不要说没有意义的内容浪费其他人的时间,比如”这需求做不了“或者”这里不可能出bug“,没有人想听到这些废话。
为什么别人的系统总是那么烂?
很多程序员解决问题的能力很强,说要解决一个什么问题,下午就能写出几百行代码把功能实现了。但是做出来的东西有种少考虑了什么东西的感觉,我花了挺久去想一个词去形容“这个东西”,最后想出了个勉强可以表达的词:程序的生命力。
大部分程序都能实现功能,但是如果把“时间”这个也作为一个考虑的维度的话,就会意识到一个合格的项目需要考虑更多的东西:更通用的使用方式、易于理解的文档、简单而易于扩展的设计,等等。而想要毁掉程序的生命力也很简单:做的更复杂,更定制化,让更少的人参与。
我跟很多程序员提过程序的生命力,比如说要让自己写的工具的操作方式跟其它Linux命令类似,或者要用一些更容易理解但不是性能最优的设计方式,又或者要他去参考现在业界主流的做法,很多人认为提这种需求的意义不大,我觉得这里还是举个例子吧。
很多公司应该都会有一些遗留系统,它们庞大、笨重、难用、几乎无法维护,所有人都在抱怨这些系统,并且每天都在想方设法换掉那些遗留系统。但是一段时间过去之后,又会发现身边的新人又开始吐槽当时替代遗留系统的那个系统了。
“大多数系统当初都很好使,功能当时够用,扩展性看起来也可以,但是这些系统都是开发的人离职之后变坏的。”
还有更好的办法吗?
成为技术专家之后的工作可以说是痛并快乐着,会有很多人找你咨询问题,另一方面,会有太多人找你咨询问题。
甚至有一段时间我每天的工作就是解答问题,小到工具使用中到疑难bug,大到架构设计,从早上到晚上基本都是在给各种各样的小伙伴提供咨询服务。
我很快发现有些地方不对头:有些问题实在是太简单了,以至于我甚至都不用思考就可以给出答案,为什么会有这种问题?
后来我在每次回答之前先问一句:
“你还有更好的办法吗?”
一小部分人立刻能给出优化后的版本,甚至我连续问几次之后,他能给出好几个优化后的版本;另小一部分人会斩钉截铁的说优化不了了,就这样了。但是大部分人会犹犹豫豫的说出一些完全不着调的回答。
后来我改成在每次回答之前先问两句:
“你要解决什么问题?”
“还有更好的办法吗?”
效果好了很多,很多小伙伴发现要解决的问题并不复杂,只是做法跑偏了。
再后来我改成了在每次回答之前先问三句:
“他们要你解决什么问题?”
“你解决的是什么问题?“
”还有更好的办法吗?“
现在第三句已经很少问到了。
成为架构师最困难的门槛是什么?
跟一些程序员交流的过程中,有不少人问我要怎么成为一名牛逼的架构师。
我最近几年面试的人挺多,发现一个有意思的现象:很多人自称架构师的人跟你讲一个架构时简直滔滔不绝,各种技术名词像是说相声一样从他嘴里说出来,三句话不离高并发大数据,但是稍微追问一下,就会发现很多基本概念的缺失,例如自称精通高并发的人说不清楚他所谓的高并发系统的瓶颈在哪里,自称精通架构设计的人说不明白他的系统怎么保证高可用,自称超大数据量的系统实际上只有不到100万条数据,等等。
架构师虽然听起来很高大上,但本质上仍然是工程师,不是科学家,也不是忽悠人的江湖骗子。学习再多,也需要实践落地。设计架构方案更多的是在做一些抽象和权衡:把复杂的需求抽象成简单的模型,从功能、性能、可用性、研发成本等等方面规划如何构建一个系统,这些内容需要更多的实践练习。
很多人没有工作在类似微博平台这种天天需要接触架构设计的地方,而很多公司没有架构方面的工作可供他们练级,于是就想办法从理论上下功夫,这类人的特征非常明显:在信息不足,甚至不了解实际场景的情况下就开始做架构设计,这种所谓的架构往往理解比较肤浅,经不住推敲。
每年招人之后我们都会做一些针对新人的架构方面的培训,课程材料基本上包括了高可用架构相关的主要方面,但是学完这些材料之后就能成为独当一面的架构师了吗?并没有。相反,这仅仅是开始,新人真正做了几个并发量上万的系统之后才算是正式入门:面对压力时才会懂得权衡,走过弯路之后才会寻找捷径。
所以我认为在架构师(和其它很多)的工作中最重要的部分是实践,夸夸其谈很容易,与其拽一些技术名词,不如把你正在做的系统真正的做好。
我和大牛之间有多少距离?
跟很多人一样,刚毕业时我觉得作为程序员,只要努力,加上少许天赋便可以获得一些成绩。
工作一段时间后,对自己和其他人的认识也越来越清晰,逐渐的发现程序员之间的差距或许比人和猴子之间的差距还大,接受这个事实这让我郁闷了很久。
再过一段时间,发现自己已经能够客观的评价自己的能力,也意识到了距离并不是那么重要,只要想办法跑的更快,就足够了。