`
maqujun
  • 浏览: 134656 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

看看国外CTO是如何设计Java软件的

阅读更多
本人在一家外企工作,由于平时在项目开发中十分重视设计模式的运用,所以很快就参与到公司的跨国项目中,有机会了解了国外CTO的一些设计思想,并且个人也参与了部分组件的设计工作。<o:p> </o:p>

从接手的项目可以看出那些国外的CTO在设计大型项目时的基本设计思想是按照组件的开发模型。因为我到手的项目均为一个个Component 同时他们非常注重Interface design。因为每个Component项目开始前都会要求我给出详细的API Javadoc。对他们而言只要Interface确定下来的话Implementation是很容易实现的。而且他们也非常强调基于Interfacefaçade 结构模式的运用,每个API 都会要求多个实现方式。<o:p></o:p>

我参与这样的设计时间并不长,所以有可能理解上会有些偏差,以下为我个人对于Interface design的理解:<o:p></o:p>

  1. 在面向对象的设计中我们希望做到的是让结构与策略实现完全分离。Interface design就可以很好的实现这一目的。<o:p></o:p>
  2. Interface 构建了软件的基本框架。<o:p></o:p>
  3. Interface限定了implementation的方法结构,并且实现了implementation的可扩展性。<o:p></o:p>
  4. 对于熟悉GOF设计模式的朋友都会总结出这样一个编程的思维方式:Interface Driven Design (接口驱动) 。几乎所有的GOF设计模式都由接口 (Interface) 驱动的。合理的Interface design为各种Gof设计模式的实现提供了可能性。<o:p></o:p>
  5. Interface design 可以明确软件逻辑工作流,如果使用Easymock等模拟框架的话,可以直接写出清晰的,可运行的Use Case. 从而实现 TDD的开发思想。<o:p></o:p>
分享到:
评论
37 楼 maqujun 2007-09-08  
JavaVision 写道
pf_miles 写道
原谅我以前很掉价的发言,实在是不应该在javaeye上参与这样的争论...
也提醒各位朋友下回一定要看清楚对方的水平与素质在决定是否要理会,打个比方吧,街上有一堆屎,很臭...你是选择避开,干些有价值的事情还是选择上去一脚把它踢飞?(OMG!~后者太恐怖了)...所以我现在走开,清理那堆屎是环卫工人的事情,我是程序员,与我无关...

就您这素质, 呵呵呵, 
好好的一个大家交流技术的平台就被你这种人弄得一滩浑水!
36 楼 pf_miles 2007-09-08  
原谅我以前很掉价的发言,实在是不应该在javaeye上参与这样的争论...
也提醒各位朋友下回一定要看清楚对方的水平与素质在决定是否要理会,打个比方吧,街上有一堆屎,很臭...你是选择避开,干些有价值的事情还是选择上去一脚把它踢飞?(OMG!~后者太恐怖了)...所以我现在走开,清理那堆屎是环卫工人的事情,我是程序员,与我无关...
35 楼 lzmhehe 2007-09-08  
同意 楼上的

大家都是两个肩膀抗个脑袋

我觉得咱和人家的差距,一个是良好的导师,一个是时间的积累
34 楼 maqujun 2007-09-08  
JavaVision 写道
pf_miles 写道
JavaVision 写道
锁上门睡觉 写道
看了評論,感覺自己做外包(coding)看來是沒有前途了!

我不觉得, 其实我们的水平也就是干干苦力的料,搞什么设计呵呵,邯郸学步罢了。

应该说你没见过牛人,所以不要把这些人也包含进去

呵呵, 也只不过是悟性稍微高了点而已,
在说软件已经过了,个人英雄的时代,
你那牛人有没有带领amazing team?有没有出色的产品?不然你就shutup, 好好干好苦力吧。

JavaVision说话很冲啊!是不是挂个外国人的logo就以为自己是外国人了阿?好像很看不起我们中国的程序员嘛。如果你和外国人合作过,你就会知道普遍的外国作软件的程序员比中国的差,而且是差很多!但为什么他们做的东西就比我们好呢?就是因为他们有一小部分牛人带领着这群小兵,软件业是永远存在着个人英雄主意的。牛人就是英雄,只是中国的软件大环境不好... 但这并不意味着我们中国人就只能干苦力!我相信在Javaeye里绝大多数会员的梦想是成为牛人,其中也包括我。所以软件设计一定要重视,要吸取外国牛人的设计思想,总结他们的成功经验。如果你认为作软件苦力是一份很有前途的职业的话,那你就继续吧,我懒得更正你自卑的想法,但请你shutup,不要到处宣扬你的自卑!
33 楼 z_jordon 2007-09-08  
测试驱动开发,项目开头都想得美美的,到后面忙的时候,就啥也不管了,所以每次项目都觉得做得很失败.
32 楼 strangecat2005 2007-09-07  
leeon 写道
老外程序员牛人有,鸟人水平也就那样,你自己看看apache那些开源项目中的代码
乱七八糟的多的是,没有必要妄自菲薄

JavaVision 写道
chenk85 写道
再好的设计也是重构得到的,如果一开始就放入大量的设计模式,那这个设计是过度设计。既然是用TDD,那一开始的代码或许就是没什么设计技巧的代码,通过持续的重构,代码的设计才能变得漂亮起来。坚持用TDD就不存在楼上的同学讲的情况,因为不会过度设计。

好像还是不明白楼主对CTO的工作的看法。

国内程序员那点鸟水平, 有多少人敢用tdd


正解...以前在国外带一个团队,程序员笨得能把人气死...正因为笨人太多,所以他们强调方法论,强调如何尽量少的依赖个人能力把东西做好。

国内我遇到的人整体上个人能力要比国外强,不过对工程项目的认识有些不重视...

31 楼 leeon 2007-09-07  
老外程序员牛人有,鸟人水平也就那样,你自己看看apache那些开源项目中的代码
乱七八糟的多的是,没有必要妄自菲薄

JavaVision 写道
chenk85 写道
再好的设计也是重构得到的,如果一开始就放入大量的设计模式,那这个设计是过度设计。既然是用TDD,那一开始的代码或许就是没什么设计技巧的代码,通过持续的重构,代码的设计才能变得漂亮起来。坚持用TDD就不存在楼上的同学讲的情况,因为不会过度设计。

好像还是不明白楼主对CTO的工作的看法。

国内程序员那点鸟水平, 有多少人敢用tdd
30 楼 凝血神抓 2007-09-07  
下面也是老外写的....
你觉得哪个更有意思呢?
String query = null;

        //Time to do some fancy SQL building
        if (code == CLIENTHOURS_PROJECTS) {
            //select = projects with hour count
            checkNull(ids, 1);
            query = "select " +
            "(select sum(r.hours) from registeredhours r where r.project_id = p.id) AS COUNT, " +
            "p.id, p.name " +
            "from project p " +
            "where p.client_id = " + ids[0];
        }
        else if (code <= CLIENTHOURS_MODULES_ON_PROJECT_ACTIVITY_EMPLOYEE) {
            //select = modules with hour count, where = project constraint
            query = "select " +
            "(select sum(r.hours) from registeredhours r where r.module_id = m.id ";
            String from = ") AS COUNT, " +
            "m.id, m.name " +
            "from module m " +
            "where m.project_id = ";

            if (code == CLIENTHOURS_MODULES_ON_PROJECT_ACTIVITY) {
                //where += activity constraint
                checkNull(ids, 2);
                String where = " and activity_id = " + ids[1];
                query += where + from + ids[0] +
                " and m.id in " +
                "(select distinct module_id from registeredhours where project_id = m.project_id " + where + ")";
            }
            else if (code == CLIENTHOURS_MODULES_ON_PROJECT_EMPLOYEE) {
                //where += employee constraint
                checkNull(ids, 2);
                String where = " and employee_id = " + ids[1];
                query += where + from + ids[0] +
                " and m.id in " +
                "(select distinct module_id from registeredhours where project_id = m.project_id " + where + ")";
            }
            else if (code > CLIENTHOURS_MODULES_ON_PROJECT) {
                //where += activity AND employee constraint
                checkNull(ids, 3);
                String where = " and activity_id = " + ids[1] + " and employee_id = " + ids[2];
                query += where + from + ids[0] +
                " and m.id in " +
                "(select distinct module_id from registeredhours where project_id = m.project_id " + where + ")";
            }
            else {
                //no additional constraint
                checkNull(ids, 1);
                query += from + ids[0];

            }

        }
        else if (code <= CLIENTHOURS_ACTIVITIES_ON_NO_PROJECT_EMPLOYEE) {
            //select = activities with hour count
            query = "select " +
            "(select sum(r.hours) from registeredhours r where r.ACTIVITY_ID = a.id ";
            String from = " ) AS COUNT, " +
            "a.id, a.name " +
            "from activity a ";
            if (code < CLIENTHOURS_ACTIVITIES_ON_NO_PROJECT) {
                //where is project constraint
                String where = "where a.id in (select distinct activity_id from registeredhours where ";

                if (code == CLIENTHOURS_ACTIVITIES_ON_PROJECT_MODULE) {
                    //where += module constraint
                    checkNull(ids, 2);
                    String where2 = " project_id = " + ids[0] + " and module_id = " + ids[1];
                    query += " and " + where2 + from + where + where2 + ")";
                }
                else if (code == CLIENTHOURS_ACTIVITIES_ON_PROJECT_EMPLOYEE) {
                    //where += employee constraint
                    checkNull(ids, 2);
                    String where2 = " project_id = " + ids[0] + " and employee_id = " + ids[1];
                    query += " and " + where2 + from + where + where2 + ")";

                }
                else if (code > CLIENTHOURS_ACTIVITIES_ON_PROJECT) {
                    //where += module AND employee constraint
                    //(code == CLIENTHOURS_ACTIVITIES_ON_PROJECT_MODULE_EMPLOYEE)
                    checkNull(ids, 3);
                    String where2 = " project_id = " + ids[0] + " and module_id = " + ids[1] +
                    " and employee_id = " + ids[2];
                    query += " and " + where2 + from + where + where2 + ")";

                }
                else {
                    //no additional constraint
                    checkNull(ids, 1);
                    String where2 = " project_id = " + ids[0];
                    query += " and " + where2 + from + where + where2 + ")";
                }
            }
            else {
                //where is no_project constraint
                String where = "where a.id in (select distinct activity_id from registeredhours where ";
                if (code == CLIENTHOURS_ACTIVITIES_ON_NO_PROJECT_EMPLOYEE) {
                    //where += employee constraint
                    checkNull(ids, 2);
                    String where2 = " project_id is null and client_id = " + ids[0] +
                    " and employee_id = " + ids[1];
                    query += " and " + where2 + from + where + where2;
                }
                else {
                    checkNull(ids, 1);
                    String where2 = " project_id is null and client_id = " + ids[0];
                    query += " and " + where2 + from + where + where2;
                }
                query += ")";
            }
        }
        else {
            //select = employees with hour count
            query = "select " +
            "(select sum(r.hours) from registeredhours r where r.employee_id = e.id ";
            String from = ") AS COUNT, " +
            "e.id, "+DBConnectionUtil.getSQL("CONCAT_NAME")+" AS name " +
            "from employee e ";
            if (code < CLIENTHOURS_EMPLOYEES_ON_NO_PROJECT) {
                //where is project constraint
                String where = "where e.id in (select distinct employee_id from registeredhours where ";
                if (code == CLIENTHOURS_EMPLOYEES_ON_PROJECT_MODULE) {
                    //where += module constraint
                    checkNull(ids, 2);
                    String where2 = " project_id = " + ids[0] + " and module_id = " + ids[1];
                    query += " and " + where2 + from + where + where2 + ")";
                }
                else if (code == CLIENTHOURS_EMPLOYEES_ON_PROJECT_ACTIVITY) {
                    //where += activity constraint
                    checkNull(ids, 2);
                    String where2 = " project_id = " + ids[0] + " and activity_id = " + ids[1];
                    query += " and " + where2 + from + where + where2 + ")";
                }
                else if (code > CLIENTHOURS_EMPLOYEES_ON_PROJECT) {
                    //where += module AND activity constraint
                    //(code == CLIENTHOURS_EMPLOYEES_ON_PROJECT_MODULE_ACTIVITY)
                    checkNull(ids, 3);
                    String where2 = " project_id = " + ids[0] +
                    " and module_id = " + ids[1] +
                    " and activity_id = " + ids[2];
                    query += " and " + where2 + from + where + where2 + ")";

                }
                else {
                    //no additional constraint
                    checkNull(ids, 1);
                    String where2 = " project_id = " + ids[0];
                    query += " and " + where2 + from + where + where2 + ")";
                }
            }
            else {
                //where is no_project constraint
                String where = " where e.id in (select distinct employee_id from registeredhours where ";
                if (code == CLIENTHOURS_EMPLOYEES_ON_NO_PROJECT_ACTIVITY) {
                    //where += employee constraint
                    checkNull(ids, 2);
                    String where2 = " project_id is null and client_id = " + ids[0] +
                    " and activity_id = " + ids[1];
                    query += " and " + where2 + from + where + where2;
                }
                else {
                    checkNull(ids, 1);
                    String where2 = " project_id is null and client_id = " + ids[0];
                    query += " and " + where2 + from + where + where2;
                }
                query += ")";
            }
        }

        log.debug("Performing Klant beheer uren query: " + query);

29 楼 pf_miles 2007-09-07  
JavaVision 写道
锁上门睡觉 写道
看了評論,感覺自己做外包(coding)看來是沒有前途了!

我不觉得, 其实我们的水平也就是干干苦力的料,搞什么设计呵呵,邯郸学步罢了。

应该说你没见过牛人,所以不要把这些人也包含进去
28 楼 pf_miles 2007-09-07  
是的,CTO是不会干这种事情的.CTO是在整个公司的技术发展方向上作引导,更多关心业界的动向和公司的发展.
只能说CTO曾经是干过这些的.
27 楼 myyate 2007-09-07  
SunMicro 写道
在项目中也一直在尝试Interface design和测试驱动,不过有时候会有一种立即实现的冲动,特别是在对一些接口设计感觉不自信的情况下,希望通过具体实现来验证,然后不知不觉就又陷入了细节考究之只中。


真他妈的同感!不知道如何解决这个坏习惯。
26 楼 Cecily 2007-09-07  
SunMicro 写道
在项目中也一直在尝试Interface design和测试驱动,不过有时候会有一种立即实现的冲动,特别是在对一些接口设计感觉不自信的情况下,希望通过具体实现来验证,然后不知不觉就又陷入了细节考究之只中。

同感,可能还是技术不到家吧,对自己没有信心,还是需要多接触些项目,累计经验才能出现好的Interface design.
25 楼 wl1985 2007-09-07  
哎,做了几个项目后,发现自我的设计水平都很差,所以现在一般都在看设计方面的资料,以前以为会代码开发就很牛了,现在发现自己还太差,学习楼上的设计,一直比较喜欢TDD(测试驱动开发)无耐一写就乱了,真该好好补补课了
24 楼 锁上门睡觉 2007-09-07  
看了評論,感覺自己做外包(coding)看來是沒有前途了!
23 楼 shrpcn 2007-09-07  
chenk85 写道
再好的设计也是重构得到的,如果一开始就放入大量的设计模式,那这个设计是过度设计。既然是用TDD,那一开始的代码或许就是没什么设计技巧的代码,通过持续的重构,代码的设计才能变得漂亮起来。坚持用TDD就不存在楼上的同学讲的情况,因为不会过度设计。

好像还是不明白楼主对CTO的工作的看法。



过渡设计不好,不过我们不需要为了展示一下重构,就“那一开始的代码或许就是没什么设计技巧的代码”?
22 楼 hlxiong 2007-09-07  
接口驱动,点点实践中。
要做的事情高人们已给规划出来了,你只要去实现他就OK了。
以一个菜鸟的眼光看,确实不错!
21 楼 dwangel 2007-09-07  
分派任务是按模块,而模块之间通信,当然是接口最好了。
你内部再变化,再refactor只要不影响对模块的使用就好。
这是模块化编程的基本思想啊。

模块里面,可能后期还有优化余地,可能函数签名发生变化,等等,
照样有可能。但是作为合作开发,你当然要给别人留一个工作接口。
20 楼 leeon 2007-09-05  
zzname 写道
1,系统设计的差别还是要根据具体项目的情况来定。
2,国外的大项目要分给很多个项目组开发,在最终整合时,只能通过接口来实现通信。这些接口之间的通信实际上就是各个项目组之间在通信,交互,最终完成一个大系统。
3,如果是小系统,功能独立。再花大量的时间来设计接口就太奢侈。这种情况花时间设计接口换来的可扩展性是有限的。国内的大项目也是通过设计接口来实现通信交互的。

总:之所以让人产生国外的项目都注重设计,国内的企业少注重设计是因为我们做国外的大项目多,小项目少;做国内的大项目少,小项目多。

最重要的是:我们应该在需要时才进行设计接口;过分的设计不适应市场需求。


正解呀,老外要我们帮他们干活,又不放心我们的能力,所以才会把所有
接口都定好,然后分块外包出来
19 楼 zzname 2007-09-05  
chenk85 写道
坚持用TDD就不存在楼上的同学讲的情况,因为不会过度设计。


单纯从设计的角度来考虑,似乎不存在过度设计;但从满足用户需求的角度来看呢?就看你认为用牛刀杀鸡过不过“度”了
18 楼 realdah 2007-09-05  
万变不离其宗。。。
lz无非谈到的还是这几样:

封装(只暴露接口,所谓的面向接口设计)
多态(提供多样的参数接口甚至不同的子类实现)
继承(提高了component复用性,等等)


相关推荐

    51CTO下载-软件设计师培训(全).pdf

    ### 软件设计师培训知识点概述 #### 一、软件设计师考试要求 1. **数据表示与运算**:掌握各种数据表示方式(如二进制、十六进制等)及算术逻辑运算规则。 2. **数学基础**:掌握线性代数、概率论与数理统计等应用...

    软件行业CTO为你讲述自己

    ### 软件行业CTO的角色与价值:开源节流的艺术 在当今的软件行业中,首席技术官(CTO)的角色日益凸显,他们不仅是技术的领导者,更是企业战略的重要参与者。CTO在软件公司中扮演着多面手的角色,不仅需要关注技术...

    从程序员到CTO的Java技术路线图

    在软件设计和架构方面,你需要掌握设计模式,如工厂模式、单例模式、观察者模式等,以及SOA(面向服务架构)和微服务架构。学习如何进行性能调优,包括代码优化、JVM内存管理、监控工具的使用等。 进入管理层后,你...

    51CTO下载-JAVA编程计算器代码.doc

    51CTO下载-JAVA编程计算器代码

    Java入门到进阶到CTO的五本书籍的链接

    包含--(1)Java编程基础、(2)Java.Web高级开发技术(3)Java网络开发(4)Java.Web核心框架(5)Java.Web系统设计与架构 五部分的书籍一脉相承的讲解Java,让你赢在起跑线上的推荐,你值得拥有。

    51CTO下载-java笔记2

    Java是一种广泛使用的面向对象的编程语言,其设计目标是具有高可靠性、安全性、跨平台兼容性。Java的基础包括语法、类、对象、接口、包、异常处理、多线程、输入输出流等核心概念。学习Java基础时,需要掌握变量、...

    从程序员到CTO跃迁的Java技术路线图

    从程序员到CTO跃迁的Java技术路线图,一图胜千言,一图胜万字,结构清晰明了,内容丰富多彩,条理简明扼要,所见即所得,简约而不简单。

    51CTO下载-2017年上半年软件设计师上午真题及答案解析

    根据提供的信息,我们可以详细分析并解释每一个题目中的知识点: ...- **解析**:在没有明确合同约定的情况下,根据中国相关法律规定,受委托开发的软件著作权归受托方所有。因此,正确答案是 **A. 甲**。

    51CTO下载-java基础、面向对象、SE核心、.rar

    Java是一种面向对象的语言,其核心在于类和对象的概念。这部分内容会讲解封装、继承、多态这三大面向对象特性,以及类的构造器、访问修饰符、抽象类、接口等关键概念。学习者需要理解如何设计和实现具有复用性和...

    软件设计师资料PDF软件设计师资料PDF软件设计师资料PDF软件设计师资料PDF

    3. **编程语言与技术栈**:软件设计师应熟练掌握至少一种或多种编程语言,如Java、Python、C++等,并熟悉相关开发工具。同时,了解前端技术(HTML、CSS、JavaScript)、数据库管理、后端框架等也是必要的。 4. **...

    java磁力链接java磁力链接java磁力链接java磁力链接

    java磁力链接

    51CTO下载-1040JAVA手机游戏编程源代码

    首先,Java源代码是程序员用Java语言编写的程序文本,它是程序设计的基础。学习源代码可以让你了解游戏背后的逻辑和实现机制,从而提升编程技能。在这个压缩包中,你可能会发现如游戏循环、对象创建、碰撞检测、动画...

    CTO 图谱 A3_技能图谱_CTO_

    这包括但不限于编程语言(如Java、Python、C++等)、操作系统原理、数据结构与算法、数据库设计、网络协议等基础知识。随着技术的不断发展,云计算、大数据、人工智能、区块链等新兴技术也成为了CTO必须关注和掌握的...

    51CTO下载-Java网络编程+讲义

    ### Java网络编程讲义知识点详解 #### 一、Java数据流输入/输出概览 **1.1 输入/输出的概念** 在程序设计中,“输入/输出”(简称I/O)通常指的是程序与外部世界(例如硬盘、网络或其他设备)之间的数据交换过程...

    2020年软考软件设计师历年真题

    《2020年软考软件设计师历年真题》是一个重要的资源,对于准备参加软件设计师考试的考生来说,具有极高的参考价值。这份资料包含了历年来的考试真题,且附带了答案讲解,有助于考生全面了解考试的题型、难度以及考察...

    51CTO下载-ACCP6.0_Y2-JAVA-毕业项目.zip

    "51CTO下载-ACCP6.0_Y2-JAVA-毕业项目.zip" 是一个专门针对ACCP(北大青鸟职业教育课程体系)6.0第二年Java编程阶段的毕业设计项目的压缩包。这个项目旨在帮助学习者巩固和提升Java编程技能,同时理解和实践软件开发...

    51CTO下载-系统架构设计师教程.part1

    51CTO下载-系统架构设计师教程.part1 共两部分。

    51CTO下载-java课后答案.rar

    不错的JAVA学习参考资料!《Java 2实用教程(3版)实验代码及答案.pdf》《java(第3版例子代码).pdf》

    51CTO下载-韩顺平java从入门到精通视频教程(全94讲)学习笔记整理(齐全)

    James Gosling 是 Java 语言的设计者之一,他的一些关键贡献包括: - **1990 年**:Sun Microsystems 启动“绿色计划”。 - **1992 年**:创建 Oak 语言,后更名为 Java。 - **1994 年**:Gosling 在硅谷大会上展示...

Global site tag (gtag.js) - Google Analytics