重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
class Person {
创新互联主要从事网站设计制作、成都网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务梁园,10余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18980820575
public String name; //定义一个name属性
public String location; //定义一个location属性
Person(String name){ //定义一个构造方法,用于初始化name属性
this.name = name;
location = "beijing"; //初始化location属性
}
Person(String name,String location) { //重载一个构造方法,用于初始化name属性和location属性
this.name = name;
this.location = location;
}
public String info() { //定义一个方法,返回实例的属性信息
return "name:"+ name +"location:"+location;
}
}
class Teacher extends Person { //定义一个Teacher类,从Person继承
private String capital;
Teacher (String name,String capital) { //定义一个构造方法,用于初始化name和capital属性
this(name,"beijing",capital); //调用本类中定义的构造方法
}
Teacher (String n,String l,String capital){ //定义一个构造方法,用于初始Teacher类中的capital,name和location属性
super (n,l); //调用父类中的构造方法初始化name,location属性
this.capital = capital; //初始化Teacher类中的capital属性
}
public String info() { //重写父类中的info()方法,并且附加capital属性的信息
return super.info() + "capital" + capital; //返回Teacher的各个属性信息
}
}
class Student extends Person { // 定义一个Student类,从Person继承
private String school; //定义chool字段
Student(String name,String school) { //定义一个构造方法,用于初始化name和school属性
this(name,"beijing",school); //调用本类中定义的构造方法
}
Student(String n,String l,String school) { //定义一个构造方法,用于初始Student类中的school,name和location属性
super(n,l); //调用父类中的构造方法初始化name,location属性
this.school = school; //初始化Student类中的school字段
}
public String info() { /重写父类中的info()方法
return super.info() + "school:" + school; //返回Student类中各个字段或属性信息
}
}
public class Test { //定义Test主类,用于测试定义各个类
public static void main (String[] args) {
Person p1 = new Person("A"); //实例化Person类,调用构造器初始化name属性
Person p2 = new Person("B","shanghai"); //实例化Person类,调用构造器初始化name,location属性
Student s1 = new Student("C","s1"); //实例化Student类,调用构造器初始化name,school属性
Student s2 = new Student("C","shanghai","s2"); //实例化Student类,调用构造器初始化name,location,school属性
Teacher t1 = new Teacher("D","perfessor"); //实例化Teacher类,调用构造器初始化name,capital属性
System.out.println(p1.info()); //输出实例p1的属性信息
System.out.println(p2.info()); //输出实例p2的属性信息
System.out.println(s1.info()); //输出实例s1的属性信息
System.out.println(s2.info()); //输出实例s2的属性信息
System.out.println(t1.info()); //输出实例t1的属性信息
}
}
在我眼里,也经常会把程序员分成两类:一种是我等这种写业务代码的程序员,另外一种是研究高深算法、造“轮子”的“科学家”...
将他们称之为科学家是有些夸张,第一次冒出这样的想法是参加一个技术大会,当别的嘉宾都在分享开发、设计、架构、管理方面的经验时,一名在腾讯工作的算法工程师(应该已经是一个小领导了),他上台分享了一些诸如:滑动平均自回归模型、神经网络基因表达式编程、SVM回归机集成学习...坐在台下的我第一次冒出这样的念头:“这**是科学家研究的东西吧。”
当然,倒也不能说写业务代码就很 low,写业务代码也不是想象中那么简单的。
写业务相关的代码,必须了解业务流程,还需要了解业务人员心里是怎么想的,也就是业务出发点是什么样子的。
比如我最近遇到一个需求,过程大概是这样的:销售人员在卖一款产品,这款产品非常火,有些优秀的销售人员一周可能能卖出去几百上千单;结果我们接到一个需求,要限制每个代理人的销售数量,比如每人只能卖 10 个(之前已经卖掉的不算);这就让我们非常奇怪,本来卖的好好的,为什么要做这个限制呢?这个需求看起来就非常的不合理。
后来业务人员和我们解释了一下原因:因为这款产品公司不挣钱,销售人员为了推这个产品,花在别的产品上的时间就少了,所以出这个功能,就是让销售人员“收收心”,把精力放在其他产品上。
这么一解释,我们就立刻明白了;所以如果你不明白业务的时候,看着需求敲代码也是非常容易出错的。
有些人会认为业务逻辑就是一堆 if-else,但是我认为在实际工作中,这些 if-else 也是非常难做到的。
业务逻辑是人设计的,业务逻辑难不可怕,可怕的是它不严谨和变化快;业务逻辑和那些确定性的东西不一样,比如我们写好的代码 if-else 两个分支,那么再怎么也不会跳出这个范围,业务逻辑就不一样了,它是非常灵活的、不确定的,业务机会来的快消失的也快,我们很难开发出来一套全面的、完善的、灵活的的系统,去应对将来可能会发生的需求。
所以在开发过程中,如果可以将业务流程拆分成多个组件模型,组件和组件配合完成一个完成的业务流程;当业务发生变化或有新业务的时候,只需要重新编排这些组件,或对某一个组件做少量更改,就可以满足业务变化;如果能做到这个程度,也是非常不容易的。
在这个过程中,你需要做到高内聚低耦合,避免过度抽象,从业务流程和动机出发,已满足业务需要为主;既然做不了“科学家”,我们就努力把业务代码写好把。
我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。
首先,我认为写业务代码不“low”,但是大部分不假思索拷贝粘贴的业务代码比较“low”,换句话说就是所谓的五年工作经验就是把第一年的工作重复了五遍。
技术人员成长一般有两条线,一条是成为技术专家,一条是成为领域专家。所谓的转管理我理解也就是领域专家,毕竟不懂得领域知识是无法做好管理的,比如说你是互联网金融某个业务部门的leader,那么你肯定要懂金融。领域知识就是在不断的写业务代码和思考中积累起来。
还有一个问题就是如何定义业务,比如说“实现一个修改订单功能”,这是一个业务需求,看起来很low,但是如果业务需求改成“实现一个修改订单功能,要求在有限资源的情况下并发10k,响应时间不高于10ms”,那这个需求就有挑战。说这个问题想说明白一件事情,如果做业务不要停留的在业务表面,仅仅满足于实现功能,要主动思考。
最后总结一下,没有最好的技术,只有最适合业务的技术。技术是内功,业务是招式,内功不足,后续成长乏力,没有招式,内功也不能发挥威力。这是也很多互联网创业公司做大了之后要技术转型的原因。
业务程序开发相对于底层基础架构层的程序开发有所不同:
业务开发的时间比较紧,变化快。
这个特点导致程序员没有时间重构代码,或者不愿意重构代码,而是用最简单粗暴的复制黏贴的方式快速实现业务逻辑。其实所有的复制黏贴都意味着需要重构。
底层系统的开发,一般是架构师和高级程序员来设计和控制项目时间。相对来说,开发周期长,变化缓慢。会更加注重架构的合理性和稳定性,而且会不断重构和改进。
业务开发一旦完成,只要平稳运行就不会有人再回来补技术债务,不会把它写得更好。除非这个业务爆发了,不得不从新架构以支持更高的并发。如果上线之后表现不佳,很可能下线不再维护。所以公司也不太愿意花太多精力在一个还没有被市场认可的产品项目上。
而底层架构框架的项目会在不同的产品项目中不断应用。不断地进化。就像Spring之类的开源框架一样,不断的升级和完善。
相对来说,业务开发程序员会花大量的时间学习和理解业务知识;而底层框架程序员更多的时间在学习技术架构。如果业务知识在行业内通用,比如财务,金融行业知识。那么长期的积累对业务开发也是很有帮助的。如果业务是很小众的,甚至,这几个月做这个业务,下半年又做另一个业务,做的时候也一知半解,就像很多外包一样,那就没有什么业务沉淀了。
我就是写业务代码的,不过我觉得这很正常啊,不知道你是怎么就觉得low啦?
所以,做为一个企业,支撑发展的肯定是他的业务,不管是卖什么服务,都要通过业务来赚钱,可能针对业务,企业内部还会做一些细化。比如说,有人会是做一些前端,一些人做后端,还有运维,运营,产品的配合。前端再细化,一部分人会做一些页面的展示,呈现,还有一部分人会做一些适合业务的工具,来提升开发效率。
那如果你自己的定位是只是单单写页面的,那只能说你对自己的要求有点低,你没有去考虑如何做一些提升工作效率的事情。举个例子,比如说常见的后台管理系统,因为功能都很类似的,那你有去考虑如何做一个通用的模版吗,还是就是不断地去重复。
这个别人的产出,做了一个vue的后台管理系统的模版,现在的GitHub star在6万多,通过这个项目,他就可以得到更多人的认可,也能得到更多的好的工作机会。
所以,不要觉得业务代码就是low的,要善于去总结,然后再分享自己的经验,没准你也能成为一个领域内的Top。
不要太在意所谓low与不low,需要在意的是做了这个项目或业务后,对自己的能力有没有长进,如果有,那说明不low。如果没有,那说明你只是在机械的劳动而已。
每个大佬都是从业务代码做起的,大佬们注重的是能否成长,学习实践的机会,以及平台的大小和未来是否和自己的目标相匹配。
总结来说,只要能提升自己能力的任何工作,都是值得的。
业务代码不一定low,能完成用户需求的代码就是好代码。
另外,对于我们搞嵌入式软件、EDA工具软件的来说,业务软件反而是更有技术含量的,更具科学意义的代码,而软件可能只是载体,你啥时候透过代码理解了它们背后的物理概念、数学公式,你就超越了程序员,能向科学家又迈进一步。
互联网软件其实也一样,软件实现的是一个业务流程的自动化,你完全可以透过你写的程序还原甲方用户的业务流程,而这种流程是老板制订的,认识会上一个层次,将来可以向老板迈进
我觉得首先大家要理解什么是“业务代码”,业务代码是一个相对的概念。
1.对于一个一般的物联网应用型公司来说,业务代码就是根据客户需求基于一个MCU或者MPU的应用控制逻辑的实现。
2.对于一个做纯上层应用的公司来说,业务代码就是基于一个操作系统为客户量身定制对应的app,并实现对应的应用逻辑。
3.对于一个微型控制器设计厂商,业务代码就是底层架构裸机的具体实现和各个外设驱动的框架设计。
4.对于一个设计操作系统的开发人员来说,业务代码就是架构设计、内存管理、调度机制优化、优先级管理、进程间通信机制优化、线程管理和内核完善等等。
所谓”业务代码”都是相对的,没有参考系怎么谈。像操作系统,站在操作系统内核提供方的角度看,上层所有的应用框架,进程服务,都是业务代码,我是为他们服务的。技术只是工具,业务实现才是目的,站在不同供应商的角度,只要涉及代码的地方都可以称之为业务代码。所以站在这个维度,如果要说业务代码“LOW”,那就没有代码是不"LOW"的了。
不过,真正接触底层或者实现RTOS底层业务框架的工程师其实是很少的。大部分工程师基本上都是对于客户需求做一些非驱动底层非操作系统框架的应用型的开发,所以大多时候“业务代码“又单一的被指向了那些只是对客户的上层应用的需求做开发、调整或者迭代的代码。
而这部分代码究竟"LOW"还是不"LOW"呢,我的答案是:不"LOW"。但是现实却是很“LOW”,之所以会被想成LOW,是因为:
1.判断一个程序员的优秀程度已经不单单看你写了多少应用型的代码,设计了多少应用框架,而是你懂不懂底层驱动逻辑,懂不懂操作系统内核,懂不懂内核裁减等等。所以这种情况会经常出现在面试过程中,面试官会因为你不懂底层驱动、不懂内核而给你比较低的薪水。
2.懂得写业务代码的人,他的程序员基础并不一定就牢固。因为上层应用可能对业务比较看重,但是对于一些特定的语言的编程并没有那么严谨。能用就可以,所以会自然而然的认为这样的程序员“LOW”。而一个会写底层驱动的人,他考虑更多的是基础代码的安全、严谨性和容量问题等等,他们的语言基础相对来说要牢固很多。
3.技术负责人一般都是全能型的人。会写底层驱动或者更懂操作系统内核的人更容易成为技术的领头人。而那些只会“业务代码”的人,放在大部分公司,一般都不会有太多的上升空间。
根据以上分析过后呢,做“业务代码”的程序员基本上会被想的很“LOW”,但是结合我的亲身经历,不同的人对于这个事情却会有不同的看法。
比如对于领导来说,那就不一样了。你将“业务代码”的需求迭代了,完善了,提前任务完成了,客户很满意。那领导不会认为你是一个很“LOW”的程序员。你很高级,领导很欣赏,“后果”很舒服。但是对于一个面试官来说,你就会点上层应用的调用和设计。我为什么要给你这么多薪水?虽然会被想成很"LOW",但是也是现实。
好了,这个问题就回答到这里,以上都是个人结合实际经历的一些体会,喜欢的加关注,我是一名深漂的嵌入式程序员,欢迎私信留言,感谢!
我有面试过一个40岁的程序员,做过几百个网站,要求工资才6000元,他只会做简单的企业网站,因为他一直在很小的公司工作,只能做小项目,这我觉得是业务代码,就是做一些重复和没难道的工作。
林子大了什么鸟都有,不知道你说的有人是指多少比例的人。我的理解代码可以分为两类:1:工具栏或者框架类2:业务类。写工具类偏重于健壮可拓展可复用;写业务类偏重于逻辑严谨没有漏洞,化繁为简。毕竟有些时候需求或者业务都不甚清楚他们想要的逻辑。有时候复杂的业务流程你捋都不顺,更别说代码写的好了。当然,工具类到高深,工具好用,框架优秀确实需要的技术功底深厚,比业务类要考虑的东西也多,但不代表写业务类代码很low。当然,不管写什么代码,完全复制黏贴而不去考虑与实际场景结合,不去想为什么?有没有更好的处理方案是比较low的
有人觉得low
1.可能是觉得没有什么技术含量吧,用的都是一些成熟的技术框架,就是一些增删改查而已,但是这并不意味着写业务代码就很简单,因为这里面包含着业务逻辑,业务逻辑有简单的也有复杂的,如果对业务逻辑业务背景不理解或理解不透就很难实施下去,其实现在很多专家级别的程序员并不是技术有多牛,而是对某个行业领域有比较深刻的理解。
2.还有可能就是内心里对业务就很轻视,这个更是不应该的,因为技术是为业务服务的,是业务让技术变的有价值。
亲测:结果为空
原因,System.exit(0)将当前JVM停止掉了。这个方法的作用就是将当前程序停止,参数为0表示正常退出,参数为1表示非正常退出。
JVM都停止了,后面的程序自然运行不了。所以finally里的语句根本没走到。