随着我做软件的时间越来越长,我发现做软件越来越难了。困难在哪里?难点在于如何做出一个好的软件。什么是好的软件标准?两个字,好用又漂亮!程序员最大的价值在于能够做出有用的、漂亮的软件。因此,我认为程序员的价值绝对不在于技术本身,而在于能够做出好用又漂亮的软件。这是一个开放的话题。这里的每个人都是菜鸟。希望并祝愿每一位技术人员都能早日成为高手,也希望有更多的老手分享经验。在这篇文章中,我将根据自己的经验进行分享,希望能给人们更多有用的信息。在这里,我只是想从技术的角度来分析一下,技术跟收入没有必然的关系。1.命名从程序代码的命名,我们就可以看出一个人的水平。最糟糕的一种命名是用中文、拼音、拼音缩写、中英文混搭,然后要么模仿命名,要么干脆乱命名。典型的模仿命名是“××DAL”。说实话,我觉得类似“UserDAL”的名字太难看了。一般来说,我知道这是一个典型的分层架构的模仿者,这表明它是有一些经验的人。随意命名,也就是在写代码的时候,名字是完全没有意义的,比如varlist=newList,其实可以写成varusers=newList。如果你想命名的更有意义,你只需要直接描述你开发意义中的每个类,每个方法,每个词的名字。2、模型抽象能力模型决定了一个系统的可用性、稳定性、易用性、可维护性和可扩展性!这个模型不是UML建模,而是软件的核心。它是你设计软件时对原理的抽象描述。该模型决定了软件的质量、易用性和可扩展性。所有优秀的软件都有一个共同的特点,那就是它的模型非常漂亮,当然也没有那么好的软件,模型也非常漂亮。MicrosoftMEF,我个人觉得它的模型构建非常漂亮优雅,感兴趣的同学可以看看本文《体验Managed Extensibility Framework精妙的设计》。MEF的核心是组合原语,如下图,它简单定义了动态组合的支撑基础,然后逐层展开。当然,因为是我写的文章,所以我也要炫耀一下OSGi.NET的设计。可以说是OSGi.NET的设计。OSGi.NET的设计也类似于MEF。核心很简单,只是实现三大功能:动态插件、面向服务、扩展。但是,我们可以从简单的OSGi.NET支持WinForm、ASP.NET、ASP.NETMVC等任意应用,从简单的控制台扩展到iOpenWorks等自动化部署和软件生产线平台。其扩展方式为:WinForm等桌面插件应用=OSGi.NET+应用插件ASP.NET应用=OSGi.NET+WebExtension+Web插件MVC应用=OSGi.NET+WebExtension+MvcWebExtension+Web插件-in自动部署=OSGi.NET应用+iOpenWorksBundleRepository+iOpenWorksBootstrap+自动升级插件远程服务=OSGi.NET应用+远程服务宿主插件负载均衡=OSGi.NET应用+远程服务宿主插件+负载均衡clientplug-in它是基于组合和扩展的,不会不断地改变OSGi.NETcore本身的代码。另外,OSGi.NETcore可以支持.NETFramework、Mono和.NETCompactFramework,因为它设计的模型很小,没有使用太多的类库来支持。3、谦虚随和我们的客户都是大公司,接触过很多各类技术人员。你可以发现一个很有趣的现象。懂得尊重他人,比较谦虚的人,在深入接触后,往往会发现自己的本领非常了不起;而说话刻薄的人则认为这个技术不是很好,那个技术没什么了不起,这个技术没什么用,我自己的东西已经很不错了,这种人的水平、经验和??见识一般都没有那么好。软件的问题不仅仅是解决一个技术问题。从技术的角度来说,只要我们学会了使用技术,那么我们就掌握了技术。因此,纯技术非常简单。相反,软件的协同开发和管理,软件的易用性,软件的美观与否,才是最头疼的事情,往往是技术水平一般、经验不足的程序员所不及的事情意识到。我接触过很多一般的程序员,大多属于这一类。他们认为该软件太简单,没有什么特别之处。他们不在乎什么想法,他们已经觉得自己掌握了很多真正的技术。4、异常处理与稳定性和健壮性通过异常处理,我们可以看出一个程序员编程的严谨和扎实的基础知识。对于Java开发者,你会发现每个方法可能都需要处理异常,声明这个函数需要处理的异常。强制约束会迫使开发者习惯性地去思考。但是,对于大多数人来说,它处理异常的方式就是简单的使用try{...}catch(ExceptionanyException){//ignoreexceptions},通过这种方式捕获所有的异常信息。这样做的好处是快速且愚蠢。缺点是一旦出现问题,你不知道问题出在哪里,发生了什么。如果有靠谱的QA就更好了,比如国外的公司,他们都有标准化的测试方法和测试流程,一旦发现问题,会把复现捕获的完整描述展示给开发者。不过国内没有严格的测试也是正常的,所以一出问题就傻了。客户绝对不可能按照问题发生的方式给你一个完整的Repro。一旦出现问题,客户会手忙脚乱,那接下来怎么办呢?你就老老实实加班,老老实实猜猜问题。当像“try{...}catch(ExceptionanyException){//ignoreexception}”这样的代码充斥整个软件系统时,你可以想象这是多么可怕。这个软件能稳定才怪!我曾经在一家热电公司工作。半夜12点,几家厂家的人聚集在热电公司,等待0点的数据采集。一旦数据少了,那你就麻烦了。到现场后,发现很多开发人员拿着笔记本,需要一直看数据库,或者需要打开软件Debug,然后每时每刻检查数据是否正常上传。这真的让我很惊讶,因为竞争太弱了!!在您的软件出现之前,您是否对其7×24不间断稳定运行没有信心?在我们的软件中,我可以通过系统运行过程的消息和日志看到一切,如下,消息窗口可以显示系统在后台运行的详细过程。另外还有一个非常完整的日志,有什么异常我都能发现并尝试重现。另一方面,关于异常处理,菜鸟程序员在编写代码或实现功能时通常不会考虑负面情况。一个软件可能按照正常的步骤走一遍,但是一旦出现意外,就麻烦了。下面是一个典型的代码。If(*****){//....dosomething...}这段代码处理了if,但是else呢?可想而知,系统中会出现意想不到的情况。所以这也是菜鸟程序员做出来的系统普遍很不稳定的一个根本原因。程序一般只考虑功能实现,忽略意外情况。5、优雅与美丽菜鸟程序员不缺乏审美,他们缺乏的是优雅与美丽的抽象能力。一个好的系统应该做到两点,易用和美观!所以,这绝对不是一堆函数而已。很多国产软件都深深烙上了技术人员的设计烙印。一眼就能看出这个软件是由技术人员设计和实现的。你可以一眼就知道这个软件的实现过程。这简直太可怕了。不过,诸位长官,这是你们的机会。菜鸟技术人员在开发功能的时候,通常都是从实现的角度来堆砌,怎么简单,怎么来。我就不细分析了,用户在操作这个功能的时候会做什么,如何将各种功能有机的结合起来,达到一个完整的组合。相反,一些技术较好的程序员往往要直接面对客户。当然,也有一些程序员因为自尊而直接退出。但是,我认为优秀的程序员基本上都是有用户意识的,希望自己的软件有好的评价,甚至影响社会。好用、好看是软件被广泛采用的先决条件。因此,我们需要学会抽象和优雅。6、基础扎实技术知识决定了一个人能做的技术水平。基础知识包括计算机组成原理、计算机操作系统、网络原理、数据库原理、计算机图形学、编译原理、数据结构、离散数学、人工智能等非常深厚的理论知识。在这些基础知识之上,还有软件开发语言、类库、框架、面向过程、面向对象、面向服务的编程思想、架构思想等等。这些知识未必会影响你现在的工作,但一定会影响你的格局,从而一定会影响你自己的发展。我遇到过一些人,理论上很差,但是技术在公司也有一定的影响力。因此,他们对技术原理不屑一顾,甚至为自己不懂太多理论却擅长实战而沾沾自喜。这些人会对那些懂理论但动手能力一般的人表现出由内而外的蔑视,却不知道那些既有基础知识又动手能力强的高手做出来的东西是什么。就像我自己一样,实在想不通那些技术天才是怎么开发出数据库、操作系统之类的软件的。所以,如果你已经发现自己的基础还不够扎实,有空还是要练练内功!7、文档和表达能力很多技术人员不会写文档。但是,坦率地说,如果您想获得更高的报酬,文档绝对是关键因素。没有文档就没有沟通,也就没有交易。有人提到,“文档是最好的生产力”,我非常认同。文件的种类很多,针对的对象也不同。不同的人对文件的理解完全不同。因此,您的文档必须适应您的目标。这对一个技术人来说太难了,他觉得还是快点写代码比较好。表达能力决定了你做的技术的影响范围,决定了你的影响力,决定了你的声望。因此,它肯定会影响你的补偿。因为这个能力影响到你的报酬,你心里可能会觉得很失落,但是没办法,这是个硬伤,不仅我不擅长写文档,但是我擅长技术。如果有一天,一个擅长忽悠,技巧不如你的人爬到你头上来领导你,那是对的。不要怪别人善于忽悠,而是想办法弥补自己的缺点。8.积极的态度。有本事的人并不像普通人那么糟糕。很简单的一句话,要想技术好,就得投入时间。如果你有时间投资于技术,那么你就没有时间投资于其他方面,尤其是被动作弊。因此,技术人员通常更可靠。积极的态度不仅是对技术,对生活也是如此。一旦有了积极的心态,从菜鸟到高手的过程只是时间问题!9、感觉软件不值这个钱。我特别恼火的是做一个软件,和一些水平不高的技术人员谈成本。只要你想做好,一切都很简单。靠良心靠能力谋生的人靠自己的力量获得适当的报酬,我们每个人都需要一份收入。我也一样,况且我还是那种把钱看在技术人员骨子里的“老板”,所以这个很大。不过,幸运的是,每个见到我的人都看得出来,我也是一个技术人员。但是,这仍然不能改变一些技术人员认为软件一文不值的观念。他们的理论是,如果把这个功能放在我身上,我一天就能搞定。你为什么要这么多钱?但是,我们在做同样的事情吗?一个功能的实现方式有很多种,就像我说的数据采集一样。如果你的数据采集实现没有下面的“1、2、3”等辅助功能,后台的实现就简单多了。如果没有命令重试,没有多线程,没有异步刷新,没有7×24小时稳定运行,没有采集数据丢失,没有顺序优先级,没有多线程分布式集群采集,不支持1GB数据采集每天等等。等待这些非功能性需求。那么这个软件就简单多了。我也见过有人用控制台,用单线程,显示的信息是完全看不懂的二进制数。运行一段时间后,CPU会100%,内存会不断增加。.这个也可以算是收藏软件。但是,菜鸟程序员一般会根据自己的做事方式来评价软件。如果他们没有很好的体验,他们通常会认为该软件没有价值。事实上,做出好看好用的软件非常难,做出好看好用又容易维护扩展的软件更难。还有几年前遇到的一个软件定制。有人直接说了。商业软件是定制的。我曾经看过一个数据采集软件。软件负责人说他们用3个人一个月就实现了这个软件,但我告诉他我们需要更多的人力和时间,他很不屑。***,我就是想看看他们的软件,他打开给我看,我在一个TextBox里没有输入任何信息就点了一个按钮,然后系统直接崩溃,抛出异常。看完笑着说,我们不做这种通过拖拽控件直接绑定数据的软件,我们要做一个好用的好看的软件,方便追踪,方便追踪状态,并支持集群部署的多线程和分布式软件。软件是充满智慧的劳动成果。如果是高贵的,有些软件就是无价的。当然,我做的软件还达不到这样的水平!10.工资这是显而易见的!薪资是价值的体现。如果你有更好的想法,欢迎补充。