zoukankan      html  css  js  c++  java
  • (转)软件的围城,谈高级语言的学习(一位架构师的忠告!)

     软件开发中,语言这一关是从业人员必须要闯的一关。 首先要记住一点:学语言并不等于是学软件.从C到C++,到JAVA,c#,VB,语言的趋势是从原有的过程型到现代的面向对象了
      过程型的语言如C,是按面向过程的思维,是人在处理事情的顺序思维体现即先算法后数据结构,缺点是如果事情过于复杂,这个过程的顺序处理中就藕合度就非常高,并且在重用性上也不利。
      面向对象的优势在于在处理事情时先把事物对象封装,再将各个过程可以灵活的串起来,即先数据结构后算法的一种思维,这样可以形成一种低藕合度的的优势,并且可以达到高度的重用。
       分析了这个背景,就看看现代高级语言的一些具体特点。
       a.现代高级语言的数据结构(JAVA或C#):
       类是一个最重要的数据结构,由于现代信息数据量的激增,在现在大容量内存中,类可以以动态,大容量(堆)的提供数据处理所要求的内存,所以在高级的语言中,类也就是这些语言中的生命基线了。
      
      所以从以前几K或几M内存的软件编写方式到现在动则上G的内存中编写代码,却实有很大的出入,但有一点要注意的是,再大的内存也是有上限的,在编写代码还是要有很多注意的技巧。
       接口,在JAVA或C#中,这也是一个很重要的结构了。如果把类看作是一个真正处理数据的载体,那么接口可以看作是这个载体的指挥官,具体一点是:接口专门作一些计划,类就负责完成这些计划。所以接口能将业务的定义和业务的实现分开对待,就像人做事要先有计划,再去按这个计划作事一样,因此接口在高级的语言中跟类一样,都是非常重要的数据结构。
       其他的就是类接口的成员了,以后有时间再说吧。。。呵呵
       b.高级语言的算法
       很多的计算机专业的都学了数据结构和算法这一门课,一直把算法的概念定位在高深的,专一的处理过程。其实在你用JAVA或C#编写第一个方法的时候,算法就开始了。方法的设计或定义,方法的具体实现等都是高级语言的算法设计体现,不要以为搞个像二叉树,图形计算的时候你就知道这是要用算法。平常的这些代码方法就是在用你的算法思路了。

      
      对于语言和软件的具体学习,我有几点建议与大家共享:
       起步:最好能有些计算原理,操作系统,数据结构,软件工程等方面的理解能力.
      (以。NET的学习为列)
      1.透过语言看本质.
       任何语言的学习是不能脱离环境来单独用的!,所以学C#肯定是要结合.NET Framework(学java除了像eclpise开发工具的应用之外,也是要结构应用一些开源框架,如spring,hibernate)
       从.NET Framework1.0,1.1,2.0,包括现在3.0,3.5的框架.框架都不外乎要做到:内存管理,安全管理,异常管理,编译环境管理,类库管理等.
      
       a.内存管理:这是任何一个优秀语言和框架的招牌功夫,不要想像现在的内存条容量很大又如何的便宜,那些垃圾软件可以在半个小时内照样把你的内存空间吃得通光!
       一个软件加载到内存中,占用的内存区可分二大部分.
      
       第一部分:代码区(存放程序代码的空间,空间大小也是差不多固定下来的).
      
       第二部分:数据区(存放程序代码加载的各种数据).
       数据区可分为:全局/静态数据区,常量数据区,栈,堆,对于全局/静态数据区,常量数据区会在程序编译阶段就已分配好了固定的空间,这样,消耗内存容量的情况就关健看栈和堆
      
      了.栈的空间大小在程序中是按固定大小分配的,这个固定大小哪倒底是多大?这是要由编译器决定的事啦,在VS.NET2003中栈的大小默认是1MB,当然我们可以通过编译选项来指定栈的大小,但通常栈也不会
      
      太大.由于栈上的内存是系统自动分配,压栈和出栈都有相应的指令来进行操作,因此效率较高,并且栈的内存空间是连续的,不会产生内存碎片,所以内存的分配管理最后重任落在了堆上,
      堆的大小只受限于系统的有效虚拟内存大小,一般是用来分配一些占用内存较大的对象或数据,由于堆所占用的内存是由开发人员来动态分配和回收的,当NEW(C#用new,C++用new,malloc)申请内存时,系统需要按一定的算法在堆空间(虚拟内存)中寻找合适的大小的空闲堆,并修改相应的维护堆空闲空间的链表,然后返回地址给程序,所以效率比栈要低,还易产生内存碎片,针对这个重任,微软在.NET 框架中作
      
      了垃圾回收的管理(GC),在.NET中引用类型的都是用堆来分布内存的,当然CG是一种被动的回收机制,要想取得更好更高的性能,快速高效的利用内存,还得要利用成对编码的原则:较晚的分配内存,最早的释放内存,在C++或C#中都提供了构造与析构的方式,但我们也可以提前执行GC,但效率始终没有C++高,呵呵,先天性的.
       b.异常管理:很多人写代码时都是把代码一写上,编译一通过,跑一下,OK,就完成了,写代码最好是在写完一句或一个功能时,要看一下,如果有错误时程序是怎么处理的,把正确时的处理与异常时的处理都作好了,你的代码肯定是OK,这样的代码才有容错机制.
       c.其他的有时间再谈
      2.读代码.
       不管你以后要作一个普通的软件工程师或高级软件研发人员,要想写出好的代码,不多读好代码,那肯定是闭门造车,所以成就软件人生,第一关是多读好的代码,现在书市上那有这样的书呀,很少,奇少!petshop,duwamish以及MSDN上的代码都是可以多读的,多读最好能练练手,自己写一写,看代码也有技巧,首先要把代码的类结构搞清楚,再去看具体实现!
      
      3.调试.
       写代码的第一关就是调试了,要想成为一个高手,除了多读好代码,多写,伴随着这个过程更多的是调试,所以调试技术最能衡量一个开发人员的重要指标,调试会让你更多的去理解软件是怎么运行的,以后会如何处理这类型的问题,常用的调试估计大学都学过,在.NET中作项目,必须得学会应用程序的调试,脚本调试,window服务及Web服务的调试,数据库程序的调试.调试技术的书籍有一本书推荐:<<.net 和windows应用程序调试>>,清华出版社的,也是Visual Studio.net产品组审校的
      
      4.理解接口和抽像类.
       这是.NET的核心之一了,大型的应用软件中,要设计成高可扩展性的应用程序,得依赖松散耦合的原则,高内聚低耦合,接口负责只作业务的定义,把定义和现实很好的剥离了,能够更好的满足这种原则,所以在.NET的设计中不用接口是不敢想像的,在C#中是采用单类多接口的继承方式来进行实现,C++中是多类继承的方式,在petshop4.0中整个的技术架构就是用的接口,在.net Framework(1.0,1.1,2.0,3.0)中也全部是采用接口的设计思想!其实这一关也是学习JAVA和C++所共同的核心,当然C++是没有接口,只提供抽像类.
      5.代码设计.
       写出好的代码,得首先要有一个好的代码结构,学会用设计模式会有助于你取得一个更好的代码结构或一个好的框架,其实常用的设计模式不多,在.NET框架中接口和抽像类是你应用设计模式的基础,也可以这么讲吧,其他的如:MVC基于BS的,抽像工厂,工厂方法,外观模式,适配器模式,命令模式,单件模式等
      6.文档.一个好的产品或软件都是伴随着各种文档产生的,文档的好处不用多说,如要作好一个软件开发人员,熟练办公软件也是基本功!熟悉基本的软件文档内容写法是最好的.
      7.项目.
       直接实践,能直接参与到项目中当然是最好的,上面的写的这些东西不仅是只适用于C#,如果你有机会作C++或JAVA,都一样可参考
      
      8.业务分析设计.
       现在软件行业的门槛很高了,对于国外的软件大厂如SAP,ORACLE,等都已经提供了二次开发的平台,东软,金碟,用友,浪潮,普元等国内大厂商无一不是这样了.他们对软件代码的编写已上升到业务的建模和设计上了.代码是自动生成并编译的.他们关注你的并不仅仅是写代码的一些能力,还要求你更多的掌握一些业务分析及设计的能力了.纯粹只知道写一些代码和SQL的人才需求越来越少,懂开发,熟悉业务,懂设计的人才更会受到公司的青睐.
      
      永远要记住:
       没有业务表现的代码只是一段垃圾代码.在学习技术的同时要不断的加强业务的学习!
      未来软件的走向:
       1.以后的软件会更多的走向整合,像用SOA的架构方式就是一种趋势也是以后肯定要大规模的应用。其实这也是一种分布式架构的体现形势(个人这么认为)
       2.未来的软件肯定会是搭积木一样的。但现阶段很多公司的开发都是从原始代码开始的。所是构件技术,模型趋动,SOA等仍然会是新一轮的热点技术之一。
       3.未来SUN的JAVA或微软的C#,C++一直会在市场中稳定的存在,肯定会赚取中国或全世界更多的票子,希望未来的你能有一个创新,发明一种新的语言跟微软和SUN去比一比,哈哈。。。
       希望你们能在微笑曲线中赚取创新,标准,产品推广这方面的票子,编码这一块的钱也要赚。呵呵
      
  • 相关阅读:
    调用EasyPlayer播放器报错FlvPlayer.load() has been called,pleasse call unload() first!,如何处理?
    开发webrtc P2P连接报错DOMException: Failed to execute XXXXXX排查及优化
    异地视频共享/组网工具EasyNTS如何进行穿透接口的数据迁移?
    视频监控如何实现异地共享/组网?EasyNTS解决远程难题
    每日总结
    关于RHEL7.5无法使用yum命令的解决方法
    java后端学习-第一部分java基础:面向对象编程
    每日总结
    每日总结
    每日总结
  • 原文地址:https://www.cnblogs.com/bluewelkin/p/1283578.html
Copyright © 2011-2022 走看看