??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲人成电影网站,无码不卡亚洲成?人片,亚洲精华国产精华精华液http://www.tkk7.com/zhb8015/zh-cnSun, 11 May 2025 15:56:13 GMTSun, 11 May 2025 15:56:13 GMT60版本代码扫盲http://www.tkk7.com/zhb8015/archive/2013/03/01/395913.htmlzhb8015zhb8015Fri, 01 Mar 2013 06:05:00 GMThttp://www.tkk7.com/zhb8015/archive/2013/03/01/395913.htmlhttp://www.tkk7.com/zhb8015/comments/395913.htmlhttp://www.tkk7.com/zhb8015/archive/2013/03/01/395913.html#Feedback0http://www.tkk7.com/zhb8015/comments/commentRss/395913.htmlhttp://www.tkk7.com/zhb8015/services/trackbacks/395913.html
AlphaQ是内部试?一般不向外部发?会有很多Bug.一般只有测试h员用?

BetaQ也是测试版Q这个阶D늚版本会一直加入新的功能。在Alpha版之后推出?

RCQ?Release Candidate) ֐思义?! 用在软g上就是候选版本。系l^C是发行候选版本。RC版不会再加入新的功能了,主要着重于除错?

GA:General Availability,正式发布的版本,在国外都是用GA来说明release版本的?

RTMQ?Release to Manufacture)是给工厂大量压片的版本,内容跟正式版是一LQ不qRTM版也有出限制、评估版的。但是和正式版本的主要程序代码都是一L?

OEMQ是l计机厂商随着计算卖的Q也是随机版。只能随机器Q不能零售。只能全新安装,不能从旧有操作系l升U。包装不像零售版_Q通常只有一面CD和说明书(授权??

RVLQ号U是正式版,其实RVLҎ不是版本的名U。它是中文版/英文版文档破解出来的?

EVALQ而流通在|络上的EVAL版,?#8220;评估?#8221;cMQ功能上和零售版没有区别?

RTLQRetail(零售?是真正的正式版,正式上架零售版。在安装盘的i386文g多w有一个eula.txtQ最后有一行EULAIDQ就是你?版本。比如简体中文正式版是EULAID:WX.4_PRO_RTL_CNQ繁体中文正式版是WX.4_PRO_RTL_TW。其中:如果是WX.开头是 正式版,WB.开头是试版。_PREQ代表家庭版Q_PROQ代表专业版?

α?#946;?#955;常用来表CY件测试过E中的三个阶D,α是第一阶段Q一般只供内部测试用;β是第二个阶段Q已l消除了软g中大部分的不完善之处Q但仍有可能 q存在缺陷和漏洞Q一般只提供l特定的用户来试使用Q?#955;是第三个阶段Q此时品已l相当成熟,只需在个别地方再做进一步的优化处理卛_上市发行?


zhb8015 2013-03-01 14:05 发表评论
]]>
how to write psedocode(reprint)http://www.tkk7.com/zhb8015/archive/2012/10/24/390186.htmlzhb8015zhb8015Wed, 24 Oct 2012 10:16:00 GMThttp://www.tkk7.com/zhb8015/archive/2012/10/24/390186.htmlhttp://www.tkk7.com/zhb8015/comments/390186.htmlhttp://www.tkk7.com/zhb8015/archive/2012/10/24/390186.html#Feedback0http://www.tkk7.com/zhb8015/comments/commentRss/390186.htmlhttp://www.tkk7.com/zhb8015/services/trackbacks/390186.html


PSEUDOCODE STANDARD

original: 
http://users.csc.calpoly.edu/~jdalbey/SWE/pdl_std.html


Pseudocode is a kind of structured english for describing algorithms. It allows the designer to focus on the logic of the algorithm without being distracted by details of language syntax.  At the same time, the pseudocode needs to be complete.  It describe the entire logic of the algorithm so that implementation becomes a rote mechanical task of translating line by line into source code.

In general the vocabulary used in the pseudocode should be the vocabulary of the problem domain, not of the implementation domain.  The pseudocode is a narrative for someone who knows the requirements (problem domain) and is trying to learn how the solution is organized.  E.g.,

Extract the next word from the line (good)
set word to get next token (poor)

Append the file extension to the name (good)
name = name + extension (poor)

FOR all the characters in the name (good)
FOR character = first to last (ok)

Note that the logic must be decomposed to the level of a single loop or decision. Thus "Search the list and find the customer with highest balance" is too vague because it takes a loop AND a nested decision to implement it. It's okay to use "Find" or "Lookup" if there's a predefined function for it such as String.indexOf().

Each textbook and each individual designer may have their own personal style of pseudocode. Pseudocode is not a rigorous notation, since it is read by other people, not by the computer. There is no universal "standard" for the industry, but for instructional purposes it is helpful if we all follow a similar style. The format below is recommended for expressing your solutions in our class.

The "structured" part of pseudocode is a notation for representing six specific structured programming constructs: SEQUENCE, WHILE, IF-THEN-ELSE, REPEAT-UNTIL, FOR, and CASE. Each of these constructs can be embedded inside any other construct. These constructs represent the logic, or flow of control in an algorithm.

It has been proven that three basic constructs for flow of control are sufficient to implement any "proper" algorithm.

SEQUENCE is a linear progression where one task is performed sequentially after another.
WHILE is a loop (repetition) with a simple conditional test at its beginning.
IF-THEN-ELSE is a decision (selection) in which a choice is made between two alternative courses of action.


Although these constructs are sufficient, it is often useful to include three more constructs:
 

REPEAT-UNTIL is a loop with a simple conditional test at the bottom.
CASE is a multiway branch (decision) based on the value of an expression. CASE is a generalization of IF-THEN-ELSE.
FOR is a "counting" loop.
SEQUENCE

Sequential control is indicated by writing one action after another, each action on a line by itself, and all actions aligned with the same indent. The actions are performed in the sequence (top to bottom) that they are written.

Example (non-computer)

Brush teeth
Wash face
Comb hair
Smile in mirror
Example
READ height of rectangle
READ width of rectangle
COMPUTE area as height times width
Common Action Keywords
Several keywords are often used to indicate common input, output, and processing operations.
Input: READ, OBTAIN, GET
Output: PRINT, DISPLAY, SHOW
Compute: COMPUTE, CALCULATE, DETERMINE
Initialize: SET, INIT
Add one: INCREMENT, BUMP
IF-THEN-ELSE

Binary choice on a given Boolean condition is indicated by the use of four keywords: IF, THEN, ELSE, and ENDIF. The general form is:

IF condition THEN
sequence 1
ELSE
sequence 2
ENDIF
The ELSE keyword and "sequence 2" are optional. If the condition is true, sequence 1 is performed, otherwise sequence 2 is performed.

Example

IF HoursWorked > NormalMax THEN
Display overtime message
ELSE
Display regular time message
ENDIF
WHILE

The WHILE construct is used to specify a loop with a test at the top. The beginning and ending of the loop are indicated by two keywords WHILE and ENDWHILE. The general form is:

WHILE condition
sequence
ENDWHILE
The loop is entered only if the condition is true. The "sequence" is performed for each iteration. At the conclusion of each iteration, the condition is evaluated and the loop continues as long as the condition is true.

Example

WHILE Population < Limit
Compute Population as Population + Births - Deaths
ENDWHILE

Example

WHILE employee.type NOT EQUAL manager AND personCount < numEmployees
INCREMENT personCount
CALL employeeList.getPerson with personCount RETURNING employee
ENDWHILE
CASE

A CASE construct indicates a multiway branch based on conditions that are mutually exclusive. Four keywords, CASE, OF, OTHERS, and ENDCASE, and conditions are used to indicate the various alternatives. The general form is:

CASE expression OF
condition 1 : sequence 1
condition 2 : sequence 2
...
condition n : sequence n
OTHERS:
default sequence
ENDCASE

The OTHERS clause with its default sequence is optional. Conditions are normally numbers or characters

indicating the value of "expression", but they can be English statements or some other notation that specifies the condition under which the given sequence is to be performed. A certain sequence may be associated with more than one condition.

Example

        CASE  Title  OF
                Mr      : Print "Mister"
                Mrs     : Print "Missus"
                Miss    : Print "Miss"
                Ms      : Print "Mizz"
                Dr      : Print "Doctor"
        ENDCASE

Example

        CASE  grade  OF
                A       : points = 4
                B       : points = 3
                C       : points = 2
                D       : points = 1
                F       : points = 0
        ENDCASE

REPEAT-UNTIL

This loop is similar to the WHILE loop except that the test is performed at the bottom of the loop instead of at the top. Two keywords, REPEAT and UNTIL are used. The general form is:

REPEAT
sequence
UNTIL condition
The "sequence" in this type of loop is always performed at least once, because the test is peformed after the sequence is executed. At the conclusion of each iteration, the condition is evaluated, and the loop repeats if the condition is false. The loop terminates when the condition becomes true.
 

FOR

This loop is a specialized construct for iterating a specific number of times, often called a "counting" loop.  Two keywords, FOR and ENDFOR are used. The general form is:

FOR iteration bounds
sequence
ENDFOR
In cases where the loop constraints can be obviously inferred it is best to describe the loop using problem domain vocabulary.

Example

FOR each month of the year (good)
FOR month = 1 to 12 (ok)

FOR each employee in the list (good)
FOR empno = 1 to listsize (ok)


NESTED CONSTRUCTS

The constructs can be embedded within each other, and this is made clear by use of indenting. Nested constructs should be clearly indented from their surrounding constructs.

Example

SET total to zero
REPEAT
READ Temperature
IF Temperature > Freezing THEN
    INCREMENT total
END IF
UNTIL Temperature < zero
Print total
In the above example, the IF construct is nested within the REPEAT construct, and therefore is indented.
 
 

INVOKING SUBPROCEDURES

Use the CALL keyword. For example:

CALL AvgAge with StudentAges
CALL Swap with CurrentItem and TargetItem
CALL Account.debit with CheckAmount
CALL getBalance RETURNING aBalance
CALL SquareRoot with orbitHeight RETURNING nominalOrbit

EXCEPTION HANDLING

    BEGIN
        statements
    EXCEPTION
        WHEN exception type
            statements to handle exception
        WHEN another exception type
            statements to handle exception
    END



Sample Pseudocode

"Adequate"

FOR X = 1 to 10

    FOR Y = 1 to 10
        IF gameBoard[X][Y] = 0
            Do nothing
        ELSE
            CALL theCall(X, Y) (recursive method)
            increment counter                 
        END IF
    END FOR
END FOR

"Better"

Set moveCount to 1
FOR each row on the board
    FOR each column on the board
        IF gameBoard position (row, column) is occupied THEN
            CALL findAdjacentTiles with row, column
            INCREMENT moveCount
        END IF
    END FOR
END FOR

(Note: the logic is restructured to omit the "do nothing" clause)


"Not So Good"

FOR all the number at the back of the array
    SET Temp equal the addition of each number
    IF > 9 THEN
        get the remainder of the number divided by 10 to that index
        and carry the "1"
    Decrement one
Do it again for numbers before the decimal
 

"Good Enough (not perfect)"

SET Carry to 0
FOR each DigitPosition in Number from least significant to most significant

    COMPUTE Total as sum of FirstNum[DigitPosition] and SecondNum[DigitPosition] and Carry  

    IF Total > 10 THEN
        SET Carry to 1
        SUBTRACT 10 from Total
    ELSE
        SET Carry to 0
    END IF

    STORE Total in Result[DigitPosition]

END LOOP  

IF Carry = 1 THEN
    RAISE Overflow exception
END IF
 



"Pretty Good"  This example shows how pseudocode is written as comments in the source file. Note that the double slashes are indented.

public boolean moveRobot (Robot aRobot)
{
    //IF robot has no obstacle in front THEN
        // Call Move robot
        // Add the move command to the command history
        // RETURN true
    //ELSE
        // RETURN false without moving the robot
    //END IF
}

Example Java Implementation

  • source code statements are interleaved with pseudocode.
  • comments that correspond exactly to source code are removed during coding.

public boolean moveRobot (Robot aRobot)
{
    //IF robot has no obstacle in front THEN
    if (aRobot.isFrontClear())
    {
        // Call Move robot
        aRobot.move();
        // Add the move command to the command history
        cmdHistory.add(RobotAction.MOVE);
        return true;
    }
    else // don't move the robot
    {
        return false;
    }//END IF
}
 




zhb8015 2012-10-24 18:16 发表评论
]]>
推荐好文章(易学~程Q?/title><link>http://www.tkk7.com/zhb8015/archive/2012/10/24/390181.html</link><dc:creator>zhb8015</dc:creator><author>zhb8015</author><pubDate>Wed, 24 Oct 2012 09:34:00 GMT</pubDate><guid>http://www.tkk7.com/zhb8015/archive/2012/10/24/390181.html</guid><wfw:comment>http://www.tkk7.com/zhb8015/comments/390181.html</wfw:comment><comments>http://www.tkk7.com/zhb8015/archive/2012/10/24/390181.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zhb8015/comments/commentRss/390181.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zhb8015/services/trackbacks/390181.html</trackback:ping><description><![CDATA[<div>http://chengyichao.info/learnable-programming/</div><img src ="http://www.tkk7.com/zhb8015/aggbug/390181.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zhb8015/" target="_blank">zhb8015</a> 2012-10-24 17:34 <a href="http://www.tkk7.com/zhb8015/archive/2012/10/24/390181.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IBM架构 机器?/title><link>http://www.tkk7.com/zhb8015/archive/2012/08/16/385591.html</link><dc:creator>zhb8015</dc:creator><author>zhb8015</author><pubDate>Thu, 16 Aug 2012 05:32:00 GMT</pubDate><guid>http://www.tkk7.com/zhb8015/archive/2012/08/16/385591.html</guid><wfw:comment>http://www.tkk7.com/zhb8015/comments/385591.html</wfw:comment><comments>http://www.tkk7.com/zhb8015/archive/2012/08/16/385591.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zhb8015/comments/commentRss/385591.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zhb8015/services/trackbacks/385591.html</trackback:ping><description><![CDATA[<div>http://www.tektalk.org/wp-content/uploads/2012/06/%E6%9E%B6%E6%9E%84%E5%8E%9F%E7%90%86%EF%BC%8D%E6%9E%B6%E6%9E%84%E5%B8%88%E7%9A%84%E4%BF%AE%E7%82%BC-v1.2-%E8%89%BE%E9%A3%9E.pdf</div><img src ="http://www.tkk7.com/zhb8015/aggbug/385591.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zhb8015/" target="_blank">zhb8015</a> 2012-08-16 13:32 <a href="http://www.tkk7.com/zhb8015/archive/2012/08/16/385591.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IBML构师寇卫东:话说E序员的职业生(?http://www.tkk7.com/zhb8015/archive/2012/08/16/385589.htmlzhb8015zhb8015Thu, 16 Aug 2012 05:13:00 GMThttp://www.tkk7.com/zhb8015/archive/2012/08/16/385589.htmlhttp://www.tkk7.com/zhb8015/comments/385589.htmlhttp://www.tkk7.com/zhb8015/archive/2012/08/16/385589.html#Feedback0http://www.tkk7.com/zhb8015/comments/commentRss/385589.htmlhttp://www.tkk7.com/zhb8015/services/trackbacks/385589.html

作者:IBM 软g集团大中华区L构师 寇卫?img title="寇卫? alt="寇卫? src="http://www.kuqin.com/upimg/allimg/111127/1K3342042-0.gif" align="right" height="280" width="200" />

有一些年ȝE序员向我咨询,来的\应该怎么赎ͼ俗话_条条大\通罗马。不同的路都能走向成功。到底选哪条\Q取决于自己的兴。可能有E序?会问Q如果还没找到自q兴趣怎么办?我的是多试Q努力做Q这是职业生涯的必经之\。当你积累了一定的技术和l验之后Q就会面临多U选择。选择哪条 路,因h而异?/p>

如果Ҏ一U或几种技术非常感兴趣Qƈ且能够持l钻研,l过一定时期的U篏Q你可以逐渐成长Z家E序员。专家E序员对于所掌握的专业技术的?l程度非一般程序员能及Q各cd见编E问题在他们手中都能q刃而解Q可以说q类专家“老越值钱”。但是这cM家也有一定的风险性:随着l验的增加和q龄 的增长,q些人的工资会越来越高,当公司改变技术\U而不再需要专家E序员所掌握的专业技术时Q或者想降低做事的成本,他们可能面临失业或者另扑ַ?的局面?/p>

资深培训专家也是个不错的发展方向。成为培训专Ӟ不仅需要深厚的技术功底,同时q要具备优秀的沟通和表达能力Q因Z们的主要工作不再是研发某U?技术,而是传播技术知识。这条\很宽Q有一些优U的技术培训师除了担Q本职工作Q还会兼职到大学里讲课。虽然培训专家的技术可能达不到专家E序员的水^Q?但是工作内容相对更ؓ丰富Q接触的Z更多?/p>

成ؓ公司的技术ȝ是很多程序员的梦惟뀂这条\U是从初U程序员成长为高U程序员之后Q以做项目ؓ工作重点Q进而发展成目l理、开发经理,最l成 为技术ȝ甚至公司副总裁。这些程序员走的是技术管理\U,从做目开始,逐渐U篏理l验Q然后成长ؓ优秀的技术管理者。技术ȝ在公司甚x术界的媄 响力非同一般,对于那些有志于成为公叔R导层的程序员Q是个很大的诱惑。但是权力大、管的h多,意味着更大的压力,技术ȝ不仅要保持对新技术的敏感Q?q要抽出_֊做管理。比h为纯技术专Ӟq条路也许更难?/p>

q有一些程序员职业发展的终ҎL构师、总设计师。这cȝ序员的兴,不是某种特定的技术,而是偏重对Y件品或者Y件应用项目的设计。如果将?仉目开发团队比作一个乐队,那么E序员就相当于一名乐手(比如提琴手、长W手{)Q他们负责将自己的乐器演奏好Q项目经理是乐队指挥Q负责指挥和协调 q个乐队的配合;架构师则相当于作曲家。从入门的架构师开始,逐渐成ؓ资深架构师乃xL构师。如同历史上伟大的作曲家Q杰出的架构师能够在各种软g中谱 写出旋律优美?#8220;曲子”?/p>

另外一些程序员心怀创业的理惻I{到自己有了一定的技术积累,再掌握一些市场需求以及管理方法,他们会开?a target="_blank">创业之\。一旦成功,q类人的影响力会非常大,像Google和雅虎的创始人,都是技?a target="_blank">创业?成功典范。但是这条\也是最艰辛的,有句话叫?#8220;不当家不知柴c”Q不亲自创业的h也很难体会它的艰辛。创业涉及方斚w面,E有差池׃功亏一,投n 创业的程序员q不,但是真正能成功的之又少。踏上这条\不仅需要过人的勇气和魄力,更需要坚韧不拔的毅力Q以及深度的商业智慧Q再加上市场ZQ才?够赢到最后?/p>

很多E序员会C技术支持\U,q而发展成为精通业务的技术和行业咨询专家。这cȝ序员会在成ؓ高E序员之后加入销售团队,直接面对客户Q负责技 术层面的问题。如果对某一行业Q比如银行、电信)非常熟悉Q久而久之,成为精通这个行业技术的专家Q如果对于某一c解x案(比如ERP、CRM?SCMQ非常擅长,可以发展成行业的技术专家?/p>

q有一部分E序员会成ؓIT专栏作家和自p业者。这些h通常对写作比较感兴趣Q文字表达能力也不错Q他们会自׃事技术工作的内容或心得写?来,然后发表文章赚取E费。只要对技术够精通,q类人是很受杂志Ƣ迎的。在北美q有一U自p业者叫做合同工Q就是不定期的承接项目,在项目开始前{订 协议Q项目完成后l束合作。虽然这U职业目前在中国q不太多Q但是其自由性对于很多程序员来讲Q也非常有吸引力?/p>

上文提及的若q条路,E序员可以根据自q兴趣q行选择Q但是一般来_无论走哪条\Q都有一个前提条Ӟ从初U程序员q阶为高U程序员。因为在q?之前Q你甚至没有选择的机会。从初q阶到高U,通常需?~5q的旉Q因个h素质而异。大安_E序员要耐得住寂寞和枯燥Q年ȝE序员更要克服Q w的心态。在职业生的v步阶D,很多人M怸着头脑Q这时一定要静下心来Q多向资q序员求教Q慢慢熟悉技术、熟悉开发流E和行业。有时你会感觉掉q?了一个知识vz,w边全是陌生的事物,很难抓住。所以就更要四处探\Q逐渐L到方向,在寻找中q步?/p>

成功q阶为高U程序员Q也q不意味着前途一片光明。如果说从初U到高需要的是学习,那么从高U到专家Q需要的是不断地试和坚持。比起前一个阶 D,q个q程更ؓ漫长Q通常需?~8 q。在q期_因ؓ有了之前的积累,q且已经取得一定的成就Qh会更加自信,同时也会更加彷LQ有一个问题会时常盘旋在脑中:来的\到底要怎么赎ͼq时 可以利用自己所U篏的资源,多做一些尝试,试不同角色、不同的目Q与不同的客h交道Q时间长了,自然会找到最适合自己的发展方向?/p>

ȝhQ初U?a target="_blank" >E序?/a>和高U程序员?期,都属于职业生涯发展的W一阶段Q我们可以称之ؓ黄金时期。这阶段E序员的q龄?0~35岁之_因ؓq轻Q所以更善于学习Q而且体力充沛Q很多走q?q个阶段的程序员有过通宵工作的经历。在q个时期Q你有大把的旉学习提高Qؓ来的事业打下坚实的基础。而一旦超q了30 岁,无论从体力还是精上Q都会有所改变Q??0~40 岁是转型时期。这时的E序员(很多人已l不再编E)已经明确了自q发展方向Qƈ且向着目标努力Q让自己有所建树?0~60岁是专家时期Q至此,一名优 U的程序员会彻底实?#8220;破茧成蝶”的愿望,成长Z家?/p>

E序员的职业很精彩,同时也很艰苦。n受高工资Q掌握最新的技术,有可能成为创业成功的富豪Q甚xZ改变人类的生zL式(例如互联|浏览器的开 发、电子商务的应用、手机短信等Q,q就是别人眼中程序员的生z,也许正因此,每年都会有很多新人加入这个庞大的队伍Q体验向往已久的精彩生zR但是大?Ch却忽略了光鲜背后的艰辛,高工资的代h是工作强度高Q学习新技术的代h是工作压力大Q成为富豪的代h是心力交瘁,而若x变hcȝ生活方式Q那p?得住日复一日的枯燥和寂寞。酸甜苦辣都要自己品,E序员的发展道\有很多条Q就看你怎么选?/p>

zhb8015 2012-08-16 13:13 发表评论
]]>
Q{Q熊节:用五q的旉跨越鸿沟http://www.tkk7.com/zhb8015/archive/2012/07/20/383606.htmlzhb8015zhb8015Fri, 20 Jul 2012 08:22:00 GMThttp://www.tkk7.com/zhb8015/archive/2012/07/20/383606.htmlhttp://www.tkk7.com/zhb8015/comments/383606.htmlhttp://www.tkk7.com/zhb8015/archive/2012/07/20/383606.html#Feedback0http://www.tkk7.com/zhb8015/comments/commentRss/383606.htmlhttp://www.tkk7.com/zhb8015/services/trackbacks/383606.htmlQ本文发表于《程序员?007q第2期,发表时有删节。)

用五q时间跨`?br />——“大学未毕业程序员”的流水帐
宗?学佛有渐修顿悟之分。说?#8220;跨越鸿沟”Q总让得像是习武之Z夜间打通Q督二脉,霎时间神清气爽nd燕,原本百思不得其解的大难题突然就q刃而解?q般境界着实o人神往Q可惜我从参加工作以来五q有余,回想h竟然没有q么一个天人合一的顿悟时刅R遗憾之余,只能安慰自己_q就是所?#8220;资质”吧?没有当下开悟的聪颖天资Q所以也难以体会跨越鸿沟的愉悦了?br />
不过x五年前的自己Q却也不是全无变?#8212;—不管技术、写作还是待人接物,?q头冒出的几根白发Q都见证着自己的成ѝ不q最大的变化q是在自己心里:当年背着书包和无法完成的学业黯然d校园的男孩,现在已经可以淡然地拿自己 q段l历打趣了。能够坦焉对自己心中最不堪回首的往事,q也是跨过一道`沟了吧?br />
北京理工大学Q我的母校,是一所有着严}学风的高 校。在受她严格的理工科基础训练而获益匪的同时Q我l于也没能达到她期望的标准?001q_在学业还剩下一q尚未完成时Q我不得不选择了离开母校—— 以一个失败者的w䆾。从那时候开始,我常怼做一个梦Q梦见自己正在高三的教室里复习准备高考,一边还鼓励自己?#8220;q次l于有机会把大学d?#8221;。能够顺 理成章地拿到本科文凭的大多数人,恐怕是体会不到q种怅然若失的缺憾感的?br />
如果说梦中的~憾感只是o人心l不宁的话,白天需要面对的是 更加现实的问题了Q一个机械工E系的肄业生要如何找C份工作来L自己Q虽然一直热衷于~程Q在学校里也有些小的实늻验,但我实在没有自信能靠q样 的背景留在IT圈里。好在当时供职联想的孟岩热心相助、《程序员》杂志蒋涛ȝ不拘一根{再加上当时创刊刚一q的杂志正需要青壮劳力,我的提前退学反倒成 了因得,早早地就l自己找C一份工作?br />
q?#8220;因祸得福”之说q不U是发扬阿Q_Q虽说薪水不高加班不,但《程序员》杂志编辑部?然是一个难得的优秀团队Q更重要的是Q在q里可以接触到前沿的技术和高端的视野,q对于正在求知识的我来说无疑是天赐良机。而且做杂志编辑还能近水楼?先得月地接触到图书出版机构,我的《重构》、《最后期限》、《与熊共舞》等几本译作都是在这D|间里完成?#8212;—Ҏ而言Q从事翻译工作最大的受益者还是我 自己Q因为翻译的q程让我真正一本书d通通透透。试想一下,q些书籍都是Martin Fowler、Tom DeMarco{前辈的心血凝aQ能它们读懂又怎会不大有裨益?

但作为杂志编辑的一个缺陷也逐渐N出来Q虽然能够看到到很多技术文?和案例分析,但毕竟没有机会亲手开发一个真正的软g。每天只是高谈阔论,毕竟站着说话不腰|一来二d成了个眼高手低的毛病。就自己尝试写些程序,?一如温伯格所_不从事专业的软g开发,永q只是业余选手Q对?#8220;专业”的问题终归想不明白。况且媒介传?#8212;—Uo是关?#8220;软g开?#8221;的媒介传?#8212;—?软g开发始l是两码事,所需的心理状态和技能是截然不同的。于是在2003q初非典肆虐的日子里Q我那颗E序员的心又开始躁动v来。要d一些真正的?Ӟ我才会知道Y件究竟应该怎么做,模模p糊中这是我对自己说的话?br />
惌d真正的Y件也不是那么Ҏ的,我的学历问题仍然是求职\?的拦路虎——我甚至不知道该如何在历里写自q教育背景Q只好含p其词地写上“曑ְM北京理工大学机械工程学院”。这样一份简历铁定入不了HRȝ?的法|我这样告诉自己,所以还得另辟蹊径。这时候一位老友Q在BBS上认识的石一Ҏ了我的贵人:此hl验丰富Q技术精湛,做着某公司的技术ȝ和好?家公司的NQ而且正好q在我素来向往的h间天堂杭州。于是几番电话之后,我便定下了前往杭州的机?br />
石一楹给我第二大的帮?#8212;—最大的 帮助自然是帮我在杭州扑ֈ一份工?#8212;—是教l我敏捷开发的理念。尚在北京时Q我曄通过电话问他Q需要准备哪些背景知识。他既没有叫我去学J2EEQ也?有让我补习SQLQ只是要我把《解析极限编E》再M遍。(当然我是刻苦的好学生Q我把整套XP丛书都买来重M一遍。)C杭州以后Q除了西湖的qh?光之外,他的工作方式同样令我震惊Q测试驱动、持l集成、故事卡、结对编E?#8230;…q些g只有在书里、在老外的办公室里才可能出现的东西,p么活生生地出 现在我眼前。这让我W一ơ生了一U朦胧的感觉Q我们也可以用正的方式做优U的Y件?br />
后来׃U种原因Q这些敏L因素在我们的目?出现得越来越。到最后,除了一套尽谈不上完备、但臛_q频J执行的试和时常进行的重构之外Q我们的目已经基本回到大家更熟悉的?#8220;普?#8221;的工作方 式了。这个现象引发了我的很多思考:Z么明明知道敏h更好的方式,我们却无法做到呢Q说来有,最后解开我这个疑惑的竟然是《坛l》中一D늦宗典故?br />
五祖弘忍座下大弟子神U偈云Q?br />
w是菩提?br />
心如明镜?br />
时时勤拂?br />
勿惹尘?br />
?多h记得的是六祖慧能与之针锋相对的那一偈。但很多Z乎忘讎ͼ以一目不识丁的獦獠之w,能听人颂《金刚经》而有所悟,六祖的根性不是常比的。这世上 有圣凭过人灵性而顿悟成佛,但更多凡夫俗子做不到q一炏V这Ҏ愚钝的凡夫俗子Q难道就不用修行、无Mq了么?别忘了,五祖M秀的偈Q也?#8220;?此偈修,免堕恉Q依此偈修,有大利益”呢?br />
于是我开始观察,观察w边的同事,也观察自己。我观察C个有的现象Q很多同行(也包括我 自己Q想要偷懒、想要逃避那些严格的纪律时常用两个借口。其一?#8220;但求悟”——“Stallman/Linus/Gates……写emacs /Linux/Basic……的时候做单元试了吗Q?#8221;Q所以我也不用做单元试。)其二?#8220;不耐渐?#8221;——“昨天有一块代码没有单元测试了?#8221;Q所?今天q块代码不写试也不太p。)亲爱的读者,不妨和我一道来摸着胸口拷问一下自己,q是不是我们常用的两套说词?

回答其实很简单:W?一我们不是Stallman/Linus/GatesQ他们是天才而我们不是;W二我们的工作还得l做下去Q而且我们希望把它做得。熵增加是宇宙的 定律Qؓ了让我们的程序、我们的目、我们的团队、我们的工作环境有序而不混ؕQ我们就必须不断地向其中注入能量——既然q做不到“菩提本无树,明镜亦非 ?#8221;Q我们就必须“时时勤拂拭,勿惹尘?#8221;。(两年后,当我成ؓ一名ThoughtWorker之后Q我才真正明白了qg事。这是后话,暂且按下?表。)

在杭州的日子里,除了与Y件开发的技术和l验之外Q我的另一大收h开始信佛。照着佛经所?#8220;观n如nQ观心如?#8221;的修行方法,?学会了如何去观察——当然包括观察别h、观察外界,但更重要的是观察自己。观察自qw体感受和心理活动,q时时调节n体与心理状态,使自pn心^和安 定。(除了别的好处之外Q这U练习让我近两年很少生病Q偶染小恙也心知肚明该如何调理痊愈,q算是信佛之后的一个意外收莗)p样带着一些经验、一些?索和一些收P2004q_在离开学校正好三年的那一天,我再ơ拨通了蒋涛的电话?br />
q次回到北京、回C媒的原因有二。其一Q我已经亲眼 见到好的l验能够如何有效地帮助Y件开发,我希望创造条件让更多好的l验被传递给更多的hQ其二,除了软g开发之外,我仍然对麦克卢汉的大众传播理论怀着 一份向往——有些事,你知道自׃会一直去做,但如果没有过瘾׃一直惦c媒体工作于我,是q样的一件事。此时蒋涛的工作重心已经从《程序员》杂?转到了CSDN|站Q我也就成了|站的技术主~?#8212;—在Web 2.0热潮到来之时Z个拥有超q?00万用L|站工作Q谁又能说这不是一U幸q呢Q?br />
?他的代表作《理解媒介》中Q麦克卢汉提Z一个媄响整个大众传播领域的理论Q媒介即是内宏V从一个非常狭H的意义上来_q就意味着l营媒体的重点不是制 造内容,而是打造一个传播^収ͼ让内容的生者与消费者在q个q_上互通有无、各取所需。在Ҏ上,q正是我重新回到传媒领域的原因:除了开发Y件、n?~程的乐之外,我一直向往成ؓ一?#8220;技术传播?#8221;——通过我的工作让更多h了解软g开发的知识和最佛_践,用我的思想d助别得成功,q给我带来的 满感丝毫不亚于解决一个技术难题。但与此同时Q我也越来越清楚自己的个性ƈ不适于从事媒体工作Q对技术的热爱使我无法中立地对待各U不同观点,?#8220;??#8221;却是媒体的一大要素;而且我喜Ƣ解军_体问题胜于h际交往Q这也决定了我无法成Z个优U的记者或ȝ。就在不断努力和认识自我的过E中Q又是半q时 间过M。Martin Fowler来了?br />
直到现在Q每当被问到“最尬的事”Ӟ我M讲这个故事。我们跟上v交大借了一间大教室Q?我们拉出了醒目的横幅和招_我们邀请了三百位客人和十多位知名专Ӟq全都是冲着Martin的面子。但在讲开始前4个小ӞSidney PinneyQ时任ThoughtWorks中国公司ȝ理)在电话里告诉我:“Martin因病不能来现场,我很抱歉……”管事后有各U关于我当时?何镇定自若的传言Q不q说实话Q我脑子里冒出的W一个念头是“赶快刮台风全城戒严吧……”也许又是一ơ因得,q桩倒霉事让我和 ThoughtWorks一下子对彼此有了更多的认识。回到北京以后,郭晓Q现任ThoughtWorks中国公司ȝ理)告诉我:也许我真正想做的是咨 询。那么好吧,q能有比ThoughtWorks更让我心仪的咨询公司么?

但即便如此,当时的我其实也没惛_Q自q竟会有多么心?ThoughtWorksq家公司——也来不及惻I唯一的想法就?#8220;l于可以n~程的快乐了”。第一个项目对我来说熟E多q生疏:卡片墙、大白板、圆?和随意滑动的椅子、免费的可乐、两Z台电?#8230;…正是我寤寐以求的工作环境啊?006q春节刚q,公司又派我去印度参加了ThoughtWorks University的学习。拿到毕业证的那一刻,泪都几乎要下?#8212;—好歹是张文凭啊,哪怕ƈ不是真正的大学呢?br />
?ThoughtWorks的时间稍长,特别是先后拜访了印度班加|尔和澳大利亚墨本两处办公室之后,我渐渐明白了一件事Q这世界上的天才比我们通常惌 的要得多,但凡人所能达到的成就却也比我们通常惌的要伟大得多。没错,我的意思就是:ThoughtWorksq不?#8220;天才q儿?#8221;Q这里的800?名员工都是有七情六欲、食人间烟火的凡人。这些凡人做Z令h刮目相看的事情、营造了令h向往的环境,仅仅是因Z们保持着自己向上的心?br />
?ThoughtWorkers常用的一个比喻,每个人都是一个热气球Q在地心引力的作用下L往下掉——累了Q病了,心情不好了,打球受伤?#8230;…无数的理 p我们惌h在沙发上度过又一个无所事事的安闲夜晚。要让气球越飞越高,唯一的办法就是不断地l它加火。个人是如此Q项目的q{、企业的环境也莫不如此?良好的项目不会自然而然地永q良好下去,它要靠每个h不断改进它的质量Q振奋h心的工作环境不是从天而降的,它是靠每个h从一张脓U、一个玩具开始积累出 来的。有些热气球飞得那么高,也许只是因ؓ它们一直没有放弃向上飞?br />
于是我真正释然了。五q的旉Q我已经走到了这里。尽自p是那?微不道——我学习新技术L很笨Q我到现在还不懂~译原理Q我的英文口语结l巴?#8230;…但我知道自己会一直向上飞。哪怕只有一点点q步Q只要每天都比前一 天更好一点点Q我׃会再让自己失望。不q生zLLq么充满戏剧性:当我q学历问题担忧Ӟ其实从来没有人因此歧视过我;而当我能够坦然地拿这个话 题开玩笑Ӟ却着实被歧视了一?#8212;—因ؓ没有本科学历Q美国大佉KҎ不考虑l我发放工作{证。在未来的若q年里,q也会是我的一个有谈资吧?br />
?惌五年来的l历Q曾l有q好多次的因得、好多次的贵人相助。我很愿意说q是因ؓ自己命好Q不q另一U解释也多少有些意思:每g事情?#8220;意义”Q其?是我们在事后l它加上的;如果用^和的眼光看待已经发生的事实,用积极的态度q接卛_到来的明天,也许所有的塞翁失马都可以变成焉知非。是的,q似乎与 因果律不W,但宗教信仰原本就不同于因果律。我信所有的事情都是祗的安排,所以我ƣ然接受?br />
但听天命q无须h力。神会给你祈求的一 切,前提是你知道自己惌什么。关?#8220;发现自己的兴和牚w”Q已l有无数q无数次Q实在不必再作强调。我惌的是Q仅仅知?#8220;了解自己”的重要性还 是远q不够的Q我们需要做更细致的工作来真正了解自己。借助一些专业而全面的心理、性格试Q你可以扑ֈ自己的性格特质和缺P然后你可以制订出h可操 作性的计划Q充分发挥自q长处Q同旉免性格~陷造成严重损失——举例来说Q假如你x演Ԍ你不必费心(也不太可能)把自己培L口若悬河的天才演?Ӟ但可以(q且应该Q想办法避免因ؓ紧张而忘词;而且你还可以发挥自己善于攉资料的特长来帮别人准备讲E,让别人替你去演讲。当Ӟ最重要的还是自?的感受:׃Ҏ间让自己静下来,然后问自己到底喜Ƣ什么、想要什么。做自己喜欢的事情更Ҏ做出成WQ而每天浪?时来做自己深恶痛绝的工作,不啻?在慢性自杀?br />
管辍学qg事困C我数q_但我q不因此而愤?#8212;—甚至有些感激。因为没有文凭,让我比别人少了一道可以依靠的墙,因此?D着我不断努力前q,不敢臾懈怠。虽说自认ؓ已经跨过了这条`沟,但我q不惛_记那U害怕一觉醒来一无所有的危机感。就让那个怅然若失的梦一直伴随着 我吧Q做一?#8220;大学未毕业程序员”Q我已经习惯了这U状态,感觉q真不错?/div>

zhb8015 2012-07-20 16:22 发表评论
]]>
8个Java人物(转自CSDN)http://www.tkk7.com/zhb8015/archive/2012/06/25/381425.htmlzhb8015zhb8015Mon, 25 Jun 2012 06:31:00 GMThttp://www.tkk7.com/zhb8015/archive/2012/06/25/381425.htmlhttp://www.tkk7.com/zhb8015/comments/381425.htmlhttp://www.tkk7.com/zhb8015/archive/2012/06/25/381425.html#Feedback0http://www.tkk7.com/zhb8015/comments/commentRss/381425.htmlhttp://www.tkk7.com/zhb8015/services/trackbacks/381425.htmloriginal:http://sd.csdn.net/a/20120625/2806851.html  

本文列D?个Java人物Q他们创Z对JavaC֌贡献很大的框架、品、工具和图书Q也因此改变了Java的编码方法?img style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 2px; margin: 0px 0px 10px 10px; padding-left: 2px; padding-right: 2px;background: #f6f6f6; float: right; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 2px" alt="" src="http://articles.csdn.net/uploads/allimg/120625/0U52A310-0.png" />一h认识下吧?/p>

8.Tomcat和Ant创办?/strong>

James-Duncan-Davidson

James Duncan DavidsonQ?997q到2001q在Sun公司工作Q他创徏了Tomcat应用服务器,q是使用最为广泛的Java Web服务器,同时q创ZAnt构徏工具QAnt使用XML来描q项目的构徏以及依赖关系Q目前仍是Java Web目构徏的事实标准?/p>

相关链接

  1. James Duncan Davidson Twitter
  2. James Duncan Davidson Wiki
  3. James Duncan Davidson personal blog
  4. Apache Ant
  5. Apache Tomcat

7.试驱动开发和JUnit的创办h

Kent-Beck

Kent Beck是极限编E和试驱动开发方法论的创始hQ此外他q开发了JUnit工具Q这是用最为广泛的Java单元试框架Q而且q有多种语言的变U都是基于该框架开发的?/p>

相关链接

  1. Kent Beck Twitter
  2. Kent Beck Wiki
  3. Kent Beck Blog
  4. JUnit Testing Framework
  5. Extreme Programming Wiki
  6. Test Driven Development Wiki

新闻和访?/strong>

  1. Kent Beck: “We thought we were just programming on an airplane”
  2. Interview with Kent Beck and Martin Fowler
  3. eXtreme Programming An interview with Kent Beck

Kent Beck图书

  1. Extreme Programming Explained: Embrace Change (2nd Edition)
  2. Refactoring: Improving the Design of Existing Code
  3. JUnit Pocket Guide

6.Java集合框架创办?/strong>

Joshua-Bloch

Joshua Bloch领导了很多Javaq_Ҏ的设计和实玎ͼ包括JDK 5.0语言增强以及屡获D荣的Java集合框架?004q?月他d了SUN公司q成为Google的首席Java架构师。此外他q因为《Effective Java》一书获得著名的Jolt大奖?/p>

相关链接

  1. Joshua Bloch Twitter
  2. Joshua Bloch Wiki

新闻和访?/strong>

  1. Effective Java: An Interview with Joshua Bloch
  2. Rock Star Josh Bloch

Joshua Bloch图书

  1. Effective Java (2nd Edition)
  2. Java Concurrency in Practice

5.JBoss创办?/strong>

Marc-Fleury

Marc Fleury?001q创办了JBossQ这是一个开源的Java应用服务器,后来该Y件卖l了U帽公司Q然后加入红帽公司lJBoss的开发,直到2007q?月?/p>

相关链接

  1. Marc Fleury Wiki
  2. Marc Fleury Blog
  3. JBoss Application Server

新闻和访?/strong>

  1. Could Red Hat lose JBoss founder?
  2. JBoss founder Marc Fleury leaves Red Hat, now what?
  3. JBoss’s Marc Fleury on SOA, ESB and OSS
  4. Resurrecting Marc Fleury

4.Struts创始?/strong>

Craig-McClanahan

Craig Mcclanahan是Struts框架的创始hQ相信每个JavaE序员都会知道Strutsq个最名的MVC框架?/p>

相关链接

  1. Craig Mcclanahan Wiki
  2. Craig Mcclanahan Blog
  3. Apache Struts

新闻和访?/strong>

  1. Interview with Craig McClanahan
  2. Struts Or JSF?

3.Spring创始?/strong>

Rod-Johnson

Rod Johnson是Spring框架的创始hQ而后创办了SpringSource公司qQCEO。此外他q写了一本书《Expert One-on-One J2EE Design and Development (2002)?/p>

相关链接

  1. Rod Johnson Twitter
  2. Rod Johnson Blog
  3. SpringSource
  4. Spring Framework Wiki

新闻和访?/strong>

  1. VMware.com : VMware to acquire SpringSource
  2. Rod Johnson : VMware to acquire SpringSource
  3. Interview with Rod Johnson – CEO – Interface21
  4. Q&A with Rod Johnson over Spring’s maintenance policy changes
  5. Expert One-on-One J2EE Design and Development: Interview with Rod Johnson

Rod Johnson图书

  1. Expert One-on-One J2EE Design and Development (Programmer to Programmer)
  2. Expert One-on-One J2EE Development without EJB

2.Hibernate创始?/strong>

gravin-king

Gavin King是Hibernate目的创始hQ这是注明的Java的ORM框架Q同时他q创ZSeam目Q另外参与了EJB 3.0和JPA设计Qƈ在其中v非常重要的作用?/p>

相关链接

  1. Gavin King Blog
  2. Hibernate Wiki
  3. Hibernate Framework
  4. JBoss seam

新闻和访?/strong>

  1. Tech Chat: Gavin King on Contexts and Dependency Injection, Weld, Java EE 6
  2. JPT : The Interview: Gavin King, Hibernate
  3. JavaFree : Interview with Gavin King, founder of Hibernate
  4. Seam in Depth with Gavin King

Gavin King 图书

  1. Java Persistence with Hibernate
  2. Hibernate in Action (In Action series)

1.Java语言之父

James-Gosling

詹姆?#183;高斯林(James GoslingQ?955q??9日-Q出生于加拿大)QY件专ӞJava~程语言的共同创始h之一Q一般公认他?#8220;Java之父”?/p>

在他12岁的时候,他已能设计电子游戏机Q帮忙邻居修理收割机。大学时期在天文pLȝ式开发工ȝQ?977q获得了加拿大卡加里大学计机U学学士学位Q?983q获得了国卡内基梅隆大学计机U学博士学位Q博士论文的题目是:"The Algebraic Manipulation of Constraints"。毕业后到IBM工作Q设计IBMW一代工作站NeWSpȝQ但不受重视。后来{至Sun公司?990q_与Patrick Naughton和Mike Sheridan{h合作“l色计划”Q后来发展一套语a叫做“Oak”Q后改名为Java?994q底QJames Gosling在硅谷召开?#8220;技术、教育和设计大会”上展CJavaE式?000q_Java成ؓ世界上最行的电脑语a?/p>

相关链接

  1. James Gosling Blog
  2. James Gosling Wiki

新闻和访?/strong>

  1. Interview with Dennis Ritchie, Bjarne Stroustrup, and James Gosling
  2. Interview: James Gosling, ‘the Father of Java’
  3. Developer Interview: James Gosling

英文Q?a target="_blank">Top 8 Java People You Should Know

译文来自Q?a target="_blank">OSCHINA



zhb8015 2012-06-25 14:31 发表评论
]]>
l数25个硅h热创业公?L创业灉|(?http://www.tkk7.com/zhb8015/archive/2012/05/10/377794.htmlzhb8015zhb8015Thu, 10 May 2012 06:51:00 GMThttp://www.tkk7.com/zhb8015/archive/2012/05/10/377794.htmlhttp://www.tkk7.com/zhb8015/comments/377794.htmlhttp://www.tkk7.com/zhb8015/archive/2012/05/10/377794.html#Feedback0http://www.tkk7.com/zhb8015/comments/commentRss/377794.htmlhttp://www.tkk7.com/zhb8015/services/trackbacks/377794.htmlhttp://news.csdn.net/a/20120329/313713_2.html

zhb8015 2012-05-10 14:51 发表评论
]]>
如何maven目导入myeclipse?/title><link>http://www.tkk7.com/zhb8015/archive/2012/04/17/374941.html</link><dc:creator>zhb8015</dc:creator><author>zhb8015</author><pubDate>Tue, 17 Apr 2012 09:06:00 GMT</pubDate><guid>http://www.tkk7.com/zhb8015/archive/2012/04/17/374941.html</guid><wfw:comment>http://www.tkk7.com/zhb8015/comments/374941.html</wfw:comment><comments>http://www.tkk7.com/zhb8015/archive/2012/04/17/374941.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zhb8015/comments/commentRss/374941.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zhb8015/services/trackbacks/374941.html</trackback:ping><description><![CDATA[<div><pre id="best-answer-content" mb10"="" style="background-image: initial !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: #c7edcc; margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial; white-space: pre-wrap; word-wrap: break-word; zoom: 1; line-height: 22px; ">在mvn的项目中 pom.xml 文g所在目录, q行 mvn eclipse:clean eclipse:eclipse ,会自动将mvn工程转成eclipse工程Q?然后在eclipse? “在myEclipse的Package Explorer 下点d键,菜单中有个Import 再点开General 里面有个Existing Projects into Workspace 点击?有个Select root directory 点击后面 Browse扑ֈ你的目所在位|?/pre></div><img src ="http://www.tkk7.com/zhb8015/aggbug/374941.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zhb8015/" target="_blank">zhb8015</a> 2012-04-17 17:06 <a href="http://www.tkk7.com/zhb8015/archive/2012/04/17/374941.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 源程序就是设?--By Jack Reeves (?http://www.tkk7.com/zhb8015/archive/2012/04/13/374080.htmlzhb8015zhb8015Fri, 13 Apr 2012 07:46:00 GMThttp://www.tkk7.com/zhb8015/archive/2012/04/13/374080.htmlhttp://www.tkk7.com/zhb8015/comments/374080.htmlhttp://www.tkk7.com/zhb8015/archive/2012/04/13/374080.html#Feedback0http://www.tkk7.com/zhb8015/comments/commentRss/374080.htmlhttp://www.tkk7.com/zhb8015/services/trackbacks/374080.htmlhttp://blog.renren.com/share/333505459/7406458537

至今Q我仍能记v当我悟q最l生下面文章时所在的地方。那?986q的夏天Q我在加利福g中国湖v军武器中心担M旉问。在q期_我有q参加了一个关于Ada的研讨会。讨论当中,有一位听众提Z一个具有代表性的问题Q?#8220;软g开发者是工程师吗Q?#8221;我不记得当时的回{,但是我却记得当时q没有真正解{这个问题。于是,我就退论,开始思考我会怎样回答q样一个问题。现在,我无法肯定当时我Z么会记v几乎10q前曄在Datamation杂志上阅读过的一论文,不过促我记L应该是后l讨Z的某些东ѝ这论文阐qC工程师ؓ什么必L好的作家Q我记得该论文谈论就是这个问?#8212;—好久没有看了Q,但是我从该论文中得到的关键一ҎQ作者认为工E过E的最l结果是文档。换句话_工程师生产的是文档,不是实物。其他hҎq些文档d造实物。于是,我就在困惑中提出了一个问题,“除了软g目正常产生的所有文档以外,q有可以被认为是真正的工E文档的东西吗?”我给出的回答是,“是的Q有q样的文档存在,q且只有一?#8212;—源代码?#8221; 

把源代码看作是一份工E文?#8212;—设计——完全颠覆了我对自己所选择的职业的看法。它改变了我看待一切事情的方式。此外,我对它思考的多Q我p觉得它阐明了软g目常常遇到的众多问题。更切地说Q我觉得大多Ch不理解这个不同的看法Q或者有意拒l它q样一个事实,p以说明很多问题。几q后Q我l于有机会把我的观点公开发表。C++ Journal中的一有兌Y件设计的论文促我给~辑写了一关于这个主题的信。经q几书信交换后Q编辑Livleen Singh同意把我关于q个主题的想法发表ؓ一论文。下面就是这文章?nbsp;

——Jack Reecves, December,22,2001 


什么是软g设计Q?nbsp;
Jack W.Reeves, 1992 

面向对象技术,特别是C++Q似乎给软g界带来了不小的震动。出C大量的论文和书籍Lq如何应用这Ҏ技术。ȝ来说Q那些关于面向对象技术是否只是一个骗局的问题已l被那些关于如何付出最的努力卛_获得收益的问题所替代。面向对象技术出现已l有一D|间了Q但是这U爆炸式的流行却g有点不寻常。h们ؓ何会H然x它呢Q对于这个问题,Zl出了各U各L解释。事实上Q很可能没有单一的原因。也许,把多U因素的l合h才能最l取得突_q且q项工作正在q展之中。尽如此,在Y仉命的q个最新阶D中QC++本n看v来似乎成Z一个主要因素。同P对于q个问题Q很可能也存在很多种理由Q不q我想从一个稍微不同的视角l出一个答案:C++之所以变得流行,是因为它使Y件设计变得更Ҏ的同Ӟ也ɾ~程变得更容易?nbsp;

虽然q个解释好像有点奇特Q但是它却是深思熟虑的l果。在q篇论文中,我就是想要关注一下编E和E序设计之间的关pR近10q来Q我一直觉得整个Y件行业都没有觉察到做Z个Y件设计和什么是真正的Y件设计之间的一个微妙的不同炏V只要看Cq一点,我认为我们就可以从C++增长的流行趋势中Q学到关于如何才能成为更好的软g工程师的意义p的知识。这个知识就是,~程不是构徏软gQ而是设计软g?nbsp;

几年前,我参见了一个讨ZQ其中讨论到软g开发是否是一门工E学U的问题。虽然我不记得了讨论l果Q但是我却记得它是如何促使我认识刎ͼ软g业已l做Z一些错误的和硬件工E的比较Q而忽视了一些绝Ҏ的Ҏ。其实,我认为我们不是Y件工E师Q因为我们没有认识到什么才是真正的软g设计。现在,我对q一Ҏ是确信无疑?nbsp;

M工程zd的最l目标都是某些类型的文档。当设计工作完成Ӟ设计文档p转交l制造团队。该团队是一个和设计团队完全不同的群体,q且其技能也和设计团队完全不同。如果设计文档正地描绘了一个完整的设计Q那么制造团队就可以着手构Z品。事实上Q他们可以着手构产品的许多实物,完全无需设计者的Mq一步的介入。在按照我的理解方式审查了Y件开发的生命周期后,我得Z个结论:实际上满_E设计标准的惟一软g文档Q就是源代码清单?nbsp;

对于q个观点Qh们进行了很多的争论,无论是赞成的q是反对的都以写成无数的论文。本文假定最l的源代码就是真正的软g设计Q然后仔l研I了该假定带来的一些结果。我可能无法证明q个观点是正的Q但是我希望证明Q它实解释了Y件行业中一些已l观察到的事实,包括C++的流行?nbsp;

在把代码看作是Y件设计所带来的结果中Q有一个结果完全盖q了所有其他的l果。它非常重要q且非常明显Q也正因为如此,对于大多数Y件机构来_它完全是一个盲炏V这个结果就是:软g的构建是廉h的。它Ҏ׃h昂贵的资|它非常的廉hQ几乎就是免费的。如果源代码是Y件设计,那么实际的Y件构建就是由~译器和q接器完成的。我们常常把~译和连接一个完整的软gpȝ的过E称?#8220;q行一ơ构?#8221;。在软g构徏讑֤上所q行的主要投资是很少?#8212;—实际需要的只有一台计机、一个编辑器、一个编译器以及一个连接器。一旦具有了一个构建环境,那么实际的Y件构建只需p许的时间。编?0 000行的C++E序也许会花费很长的旉Q但是构Z个具有和50 000行C++E序同样设计复杂性的gpȝ要花费多长的旉呢? 

把源代码看作是Y件设计的另外一个结果是QY件设计相Ҏ于创作,臛_在机械意义上如此。通常Q编写(也就是设计)一个具有代表性的软g模块Q?0?00行代码)只需p几天的时_对它q行完全的调试是另外一个议题,E后会对它进行更多的讨论Q。我很想问一下,是否q有M其他的学U可以在如此短的旉内,产生出和软gh同样复杂性的设计来,不过Q首先我们必要弄清出如何来度量和比较复杂性。然而,有一Ҏ明显的,那就是Y件设计可?极ؓq速地变得非常庞大?nbsp;

假设软g设计相对易于创作Qƈ且在本质上构v来也没有什么代P一个不令h吃惊的发现是QY件设计往往是难以置信的庞大和复杂。这看v来似乎很明显Q但是问题的重要性却常常被忽视。学校中的项目通常h数千行的代码。具?0 000行代码(设计Q的软g产品被它们的设计者丢弃的情况也是有的。我们早׃再关注于单的软g。典型的商业软g的设计都是由数十万行代码l成的。许多Y件设计达C上百万行代码。另外,软g设计几乎L在不断地演化。虽然当前的设计可能只有几千行代码,但是在品的生命期中Q实际上可能要编写许多倍的代码?nbsp;

管实存在一些硬件设计,它们看v来似乎和软g设计一样复杂,但是h意两个有关现代硬件的事实。第一Q复杂的g工程成果未必L没有错误的,在这一点上Q它不存在像软g那样让我们相信的评判标准。多数的微处理器在发售时都具有一些逻辑错误Q桥梁坍塌,大坝破裂Q飞机失事以及数以千计的汽R和其他消费品被召?#8212;—所有的q些我们都记忆犹斎ͼ所有的q些都是设计错误的结果。第二,复杂的硬件设计具有与之对应的复杂、昂늚构徏阶段。结果,刉这U系l所需的能力限制了真正能够生复杂g设计公司的数目。对于Y件来_没有q种限制。目前,已经有数以百计的软g机构和数以千计的非常复杂的Y件系l存在,q且数量以及复杂性每天都在增ѝ这意味着软g行业不可能通过仿效g开发者找到针对自w问题的解决办法。倘若一定要说出有什么相同之处的话,那就是,当CAD和CAM可以做到帮助g设计者创来越复杂的设计时Q硬件工E才会变得和软g开发越来越像?nbsp;

设计软g是一U管理复杂性的zd。复杂性存在于软g设计本n之中Q存在于公司的Y件机构之中,也存在于整个软g行业之中。Y件设计和pȝ设计非常怼。它可以跨越多种技术ƈ且常常涉及多个学U分支。Y件的规格说明往往不固定、经常快速变化,q种变化常常在正q行软g设计时发生。同P软g开发团队也往往不固定,常常在设计过E的中间发生变化。在许多斚wQY仉要比g更像复杂的社会或者有机系l。所有这些都使得软g设计成ؓ了一个困隄q且易出错的q程。虽然所有这些都不是创造性的xQ但是在软g工程革命开始将q?0q后的今天,和其他工E行业相比,软g开发看h仍然像是一U未受过训练QundisciplinedQ的技艺?nbsp;

一般的看法认ؓQ当真正的工E师完成了一个设计,不管该设计有多么复杂Q他们都非常信该设计是可以工作的。他们也非常信该设计可以用公认的技术徏造出来。ؓ了做到这一点,g工程师花费了大量的时间去验证和改q他们的设计。例如,误虑一个桥梁设计。在q样一个设计实际徏造之前,工程师会q行l构分析——他们建立计算机模型ƈq行仿真Q他们徏立比例模型ƈ在风z中或者用其他一些方法进行测试。简而言之,在徏造前Q设计者会使用他们能够惛_的一切方法来证实设计是正的。对于一架新型客机的设计来说Q情는x加严重;必须要构建出和原物同寸的原型,q且必须要进行飞行测试来验证设计中的U种预计?nbsp;

对于大多Ch来说QY件中明显不存在和g设计同样严格的工E。然而,如果我们把源代码看做是设计,那么׃发现软g工程师实际上对他们的设计做了大量的验证和改进。Y件工E师不把q称为工E,而称它ؓ试和调试。大多数Z把测试和调试看作是真正的“工程”——在Y件行业中肯定没有被看作是。造成q种看法的原因,更多的是因ؓ软g行业拒绝把代码看作设计,而不是Q何实际的工程差别。事实上Q试验模型、原型以及电路试验板已经成ؓ其他工程学科公认的组成部分。Y件设计者之所以不h或者没有用更多的正规Ҏ来验证他们的设计Q是因ؓ软g构徏周期的简单经规律?nbsp;

W一个启C:仅仅构徏设计q测试它比做M其他事情要廉价一些,也简单一些。我们不兛_做了多少ơ构?#8212;—q些构徏在时间方面的代h几乎为零Qƈ且如果我们丢弃了构徏Q那么它所使用的资源完全可以重新利用。请注意Q测试ƈ非仅仅是让当前的设计正确Q它也是改进设计的过E的一部分。复杂系l的g工程师常常徏立模型(或者,臛_他们把设计用计算机图形直观地表现出来Q。这׃得他们获得了对于设计的一U?#8220;感觉”Q而仅仅去查设计是不可能获得这U感觉的。对于Y件来_构徏q样一个模型既不可能也无必要。我们仅仅构Z品本w。即使正规的软g验证可以和编译器一栯动进行,我们q是会去q行构徏/试循环。因此,正规的验证对于Y件行业来说从来没有太多的实际意义?nbsp;

q就是现今Y件开发过E的现实。数量不断增长的人和机构正在创徏着更加复杂的Y件设计。这些设计会被先用某些编E语a~写出来Q然后通过构徏/试循环q行验证和改q。过E易于出错,q且不是特别的严根{相当多的Y件开发h员ƈ不想怿q就是过E的q作方式Q也正因一点,佉K题变得更加复杂?nbsp;

当前大多数的软gq程都试图把软g设计的不同阶D分d不同的类别中。必要在顶层的设计完成q且ȝ后,才能开始编码。测试和调试只对清除建造错误是必要的。程序员处在中间位置Q他们是软g行业的徏造工人。许多h认ؓQ如果我们可以让E序员不再进?#8220;随意的编码(hackingQ?#8221;q且按照交给他们的设计去q行构徏Q还要在q程中,犯更的错误Q,那么软g开发就可以变得成熟Q从而成Z门真正的工程学科。但是,只要q程忽视了工E和l济学事实,q就不可能发生?nbsp;

例如QQ何一个现代行业都无法忍受在其刉过E中出现过100%的返工率。如果一个徏造工人常怸能在W一ơ就构徏正确Q那么不久他׃׃。但是在软g业中Q即使最的一块代码,在测试和调试期间Q也很可能会被修正或者完全重写。在一个创造性的q程中(比如Q设计)Q我们认可这U改q不是制造过E的一部分。没有h会期望工E师W一ơ就创徏出完的设计。即使她做到了,仍然必须让它l受改进q程Q目的就是ؓ了证明它是完的?nbsp;

即我们从日本的理Ҏ中没有学CQ何东西,我们也应该知道由于在q程中犯错误而去责备工h是无益于提高生率的。我们不应该不断地强qY件开发去W合不正的q程模型Q相反,我们需要去改进q程Q之有助于而不是阻生更好的软g。这是“软g工程”的石蕊测试。工E是关于你如何实施过E的Q而不是关于是否需要一个CADpȝ来生最l的设计文档?nbsp;

关于软g开发有一个压倒性的问题Q那是一切都是设计过E的一部分。编码是设计Q测试和调试是设计的一部分Qƈ且我们通常认ؓ的设计仍然是设计的一部分。虽然Y件构v来很廉hQ但是设计v来却是难以置信的昂贵。Y仉常的复杂Q具有众多不同方面的设计内容以及它们所D的设计考虑。问题在于,所有不同方面的内容是相互关q的Q就像硬件工E中的一P。我们希望顶层设计者可以忽视模块算法设计的l节。同P我们希望E序员在设计模块内部法时不必考虑层设计问题。糟p的是,一个设计层面中的问题R入到了其他层面之中。对于整个Y件系l的成功来说Qؓ一个特定模块选择法可能和Q何一个更高层ơ的设计问题同样重要。在软g设计的不同方面内容中Q不存在重要性的{。最低层模块中的一个不正确设计可能和最高层中的错误一栯命。Y件设计必d所有的斚w都是完整和正的Q否则,构徏于该设计基础之上的所有Y仉会是错误的?nbsp;

Z理复杂性,软g被分层设计。当E序员在考虑一个模块的详细设计Ӟ可能q有C百计的其他模块以及数以千计的l节Q他不可能同旉及。例如,在Y件设计中Q有一些重要方面的内容不是完全属于数据l构和算法的范畴。在理想情况下,E序员不应该在设计代码时q得去考虑设计的这些其他方面的内容?nbsp;

但是Q设计ƈ不是以这U方式工作的Qƈ且原因也开始变得明朗。Y件设计只有在其被~写和测试后才算完成。测试是设计验证和改q过E的基础部分。高层结构的设计不是完整的Y件设计;它只是细节设计的一个结构框架。在严格地验证高层设计方面,我们的能力是非常有限的。详l设计最l会寚w层设计造成的媄响至和其他的因素一样多Q或者应该允许这U媄响)。对设计的各个方面进行改q,是一个应该诏I整个设计周期的q程。如果设计的M一个方面内容被ȝ在改q过E之外,那么对于最l设计将会是p糕的或者甚x法工作这一点,׃会觉得奇怪了?nbsp;

如果高层的Y件设计可以成Z个更加严格的工程q程Q那该有多好呀Q但是Y件系l的真实情况不是严格的。Y仉常的复杂Q它依赖于太多的其他东西。或许,某些g没有按照设计者认为的那样工作Q或者一个库例程h一个文档中没有说明的限制。每一个Y仉目迟早都会遇到这些种cȝ问题。这些种cȝ问题会在试期间被发玎ͼ如果我们的测试工作做得好的话Q,之所以如此是因ؓ没有办法在早期就发现它们。当它们被发现时Q就q对设计进行更攏V如果我们幸q,那么对设计的更改是局部的。时常,更改会L及到整个软g设计中的一些重要部分(莫非定律Q。当受到影响的设计的一部分׃某种原因不能更改Ӟ那么Z能够适应影响Q设计的其他部分必d遭到破坏。这通常D的结果就是管理者所认ؓ?#8220;随意~码”Q但是这是软g开发的现实?nbsp;

例如Q在我最q工作的一个项目中Q发C模块A的内部结构和另一个模块B之间的一个时序依赖关pR糟p的是,模块A的内部结构隐藏在一个抽象体的后面,而该抽象体不允许以Q何方法把Ҏ块B的调用合入到它的正确调用序列中。当问题被发现时Q当然已l错q了更改A的抽象体的时机。正如所料,所发生的就是把一个日益增长的复杂?#8220;修正”集应用到A的内部设计上。在我们q没有安装完版本1Ӟ普遍感觉到设计正在衰退。每一个新的修正很可能都会破坏一些老的修正。这是一个正规的软g开发项目。最后,我和我的同事军_对设计进行更改,但是Z得到理层的同意Q我们不得不自愿无偿加班?nbsp;

在Q何一般规模的软g目中,肯定会出现像q样的问题,管Z使用了各U方法来防止它的出现Q但是仍然会忽视一些重要的l节。这是工艺和工E之间的区别。如果经验可以把我们引向正确的方向,q就是工艺。如果经验只会把我们带入未知的领域,然后我们必须使用一开始所使用的方法ƈ通过一个受控的改进q程把它变得更好Q这是工程?nbsp;

我们来看一下只是作为其中很一点的内容Q所有的E序员都知道Q在~码之后而不是之前编写Y件设计文档会产生更加准确的文档。现在,原因是显而易见的。用代码来表现的最l设计是惟一一个在构徏/试循环期间被改q的东西。在q个循环期间Q初始设计保持不变的可能性和模块的数量以及项目中E序员的数量成反比。它很快׃变得毫无价倹{?nbsp;

在Y件工E中Q我们非帔R要在各个层次都优U的设计。我们特别需要优U的顶层设计。初期的设计好Q详l设计就会越Ҏ。设计者应该用Q何可以提供帮助的东西。结构图表、Booch 图、状态表、PDL{等——如果它能够提供帮助,去使用它。但是,我们必须CQ这些工具和W号都不是Y件设计。最后,我们必须创徏真正的Y件设计,q且是用某U编E语a完成的。因此,当我们得计时Q我们不应该x对它们q行~码。在必要Ӟ我们必须应该乐于Lq它们?nbsp;

至今Q还没有M设计W号可以同时适用于顶层设计和详细设计。设计最l会表现Z某种~程语言~写的代码。这意味着在详l设计可以开始前Q顶层设计符号必被转换成目标编E语a。这个{换步骤耗费旉q且会引入错误。程序员常常是对需求进行回ƈ且重新进行顶层设计,然后Ҏ它们的实际去q行~码Q而不是从一个可能没有和所选择的编E语a完全映射的符可行{换。这同样也是软g开发的部分现实情况?nbsp;

也许Q如果让设计者本人来~写初始代码Q而不是后来让其他人去转换语言无关的设计,׃更好一些。我们所需要的是一个适用于各个层ơ设计的l一W号。换句话_我们需要一U编E语aQ它同样也适用于捕获高层的设计概念。CQ+正好可以满q个要求。C++是一门适用于真实项目的~程语言Q同时它也是一个非常具有表辑֊的Y件设计语a。C++允许我们直接表达关于设计lg的高层信息。这P可以更Ҏ地进行设计,q且以后可以更容易地改进设计。由于它h更强大的cd查机Ӟ所以也有助于检到设计中的错误。这׃生了一个更加健壮的设计Q实际上也是一个更好的工程化设计?nbsp;

最后,软g设计必须要用某种~程语言表现出来Q然后通过一个构?试循环对其q行验证和改q。除此之外的M其他d都完全没有用。请考虑一下都有哪些Y件开发工具和技术得以流行。结构化~程在它的时代被认ؓ是创造性的技术。Pascal使之变得行Q从而自׃变得行。面向对象设计是新的行技术,而C++是它的核心。现在,误虑一下那些没有成效的东西。CASE工具Q流行吗Q是的;通用吗?不是。结构图表怎么P情况也一栗同样地Q还有Warner-Orr图、Booch图、对象图以及你能惌v的一切。每一个都有自q强项Q以及惟一的一个根本弱?#8212;—它不是真正的软g设计。事实上Q惟一一个可以被普遍认可的Y件设计符hPDLQ而它看v来像什么呢Q?nbsp;

q表明,在Y件业的共同潜意识中本能地知道Q编E技术,特别是实际开发所使用的编E语a的改q和软g行业中Q何其他东西相比,h压倒性的重要性。这q表明,E序员关心的是设计。当出现更加h表达力的~程语言Ӟ软g开发者就会用它们?nbsp;

同样Q请考虑一下Y件开发过E是如何变化的。从前,我们使用瀑布式过E。现在,我们谈论的是螺旋式开发和快速原型。虽然这U技术常常被认ؓ可以“消除风险”以及“~短产品的交付时?#8221;Q但是它们事实上也只是ؓ了在软g的生命周期中更早地开始编码。这是好事。这使得构徏/试循环可以更早地开始对设计q行验证和改q。这同样也意味着Q顶层Y件设计者很有可能也会去q行详细设计?nbsp;

正如上面所表明的,工程更多的是关于如何d施过E的Q而不是关于最l品看h的像什么。处在Y件行业中的我们,已经接近工程师的标准Q但是我们需要一些认知上的改变。编E和构徏/试循环是工EY件过E的中心。我们需要以像这L方式ȝ理它们。构?试循环的经规律,再加上Y件系l几乎可以表CQ何东西的事实Q就使得我们完全不可能找ZU通用的方法来验证软g设计。我们可以改善这个过E,但是我们不能q它?nbsp;

最后一点:M工程设计目的目标是一些文档品。显Ӟ实际设计的文档是最重要的,但是它们q惟一要生的文档。最l,会期望某些h来用Y件。同Ppȝ很可能也需要后l的修改和增强。这意味着Q和g目一P辅助文档对于软g目h同样的重要性。虽然暂时忽略了用户手册、安装指南以及其他一些和设计q程没有直接联系的文档,但是仍然有两个重要的需求需要用辅助设计文档来解决?nbsp;

辅助文档的第一个用途是从问题空间中捕获重要的信息,q些信息是不能直接在设计中用的。Y件设计需要创造一些Y件概忉|寚w题空间中的概念进行徏模。这个过E需要我们得Z个对问题I间中概늚理解。通常Q这个理解中会包含一些最后不会被直接建模到Y件空间中的信息,但是q些信息却仍然有助于设计者确定什么是本质概念以及如何最好地对它们徏模。这些信息应该被记录在某处,以防以后要去更改模型?nbsp;

对辅助文档的W二个重要需要是对设计的某些斚w的内容进行记录,而这些方面的内容是难以直接从设计本n中提取的。它们既可以是高层方面的内容Q也可以是低层方面内宏V对于这些方面内容中的许多来_囑Ş是最好的描述方式。这׃得它们难以作为注释包含在代码中。这q不是说要用囑Ş化的软g设计W号代替~程语言。这和用一些文本描q来对硬件科目的囑Ş化设计文档进行补充没有什么区别?nbsp;

决不要忘讎ͼ是源代码军_了实际设计的真实样子Q而不是辅助文档。在理想情况下,可以使用软g工具Ҏ代码q行后期处理q生出辅助文档。对于这一点,我们可能期望q高了。次一点的情况是,E序员(或者技术方面的~写者)可以使用一些工具从源代码中提取Z些特定的信息Q然后可以把q些信息以其他一些方式文档化。毫无疑问,手工对这U文档保持更新是困难的。这是另外一个支持需要更兯辑֊的编E语a的理由。同Pq也是一个支持ɘq种辅助文档保持最ƈ且尽可能在项目晚期才使之变成正式的理由。同P我们可以使用一些好的工P不然的话Q我们就得求助于铅笔、纸以及黑板?nbsp;

ȝ如下Q?nbsp;
  实际的Y件运行于计算Z中。它是存储在某种介质中??的序列。它不是使用C++语言Q或者其他Q何编E语aQ编写的E序?nbsp;
  E序清单是代表Y件设计的文档。实际上把Y件设计构建出来的是编译器和连接器?nbsp;
  构徏实际软g设计的廉L度是令h难以|信的,q且它始l随着计算机速度的加快而变得更加廉仗?nbsp;
  设计实际软g的昂늨度是令h难以|信的,之所以如此,是因Y件的复杂性是令h难以|信的,q且软g目的几乎所有步骤都是设计过E的一部分?nbsp;
  ~程是一U设计活?#8212;—好的软g设计q程认可q一点,q且在编码显得有意义Ӟ׃毫不犹U的去~码?nbsp;
  ~码要比我们所认ؓ的更频繁地显现出它的意义。通常Q在代码中表现设计的q程会揭C出一些疏漏以及额外的设计需要。这发生的越早,设计׃好?nbsp;
  因ؓ软g构徏h非常廉hQ所以正规的工程验证Ҏ在实际的软g开发中没有多大用处。仅仅徏造设计ƈ试它要比试囑֎证明它更单、更廉h?nbsp;
  试和调试是设计zd——对于软g来说Q它们就相当于其他工E学U中的设计验证和改进q程。好的Y件设计过E认可这一点,q且不会试图d这些步骤?nbsp;
  q有一些其他的设计zd——U它们ؓ高层设计、模块设计、结构设计、构架设计或者诸如此cȝ东西。好的Y件设计过E认可这一点,q且慎重地包含这些步骤?nbsp;
  所有的设计zd都是怺影响的。好的Y件设计过E认可这一点,q且当不同的设计步骤昄出有必要Ӟ它会允许设计改变Q有时甚xҎ上的改变Q?nbsp;
  许多不同的Y件设计符号可能是有用?#8212;—它们可以作ؓ辅助文档以及工具来帮助简化设计过E。它们不是Y件设计?nbsp;
  软g开发仍然还是一门工艺,而不是一个工E学U。主要是因ؓ~Z验证和改善设计的关键q程中所需的严格性?nbsp;
  最后,软g开发的真正q步依赖于编E技术的q步Q而这又意味着~程语言的进步。C++是q样的一个进步。它已经取得了爆炸式的流行,因ؓ它是一门直接支持更好的软g设计的主编E语a?nbsp;
  C++在正的方向上迈Z一步,但是q需要更大的q步?nbsp;

??nbsp;

当我回顾几乎10q前所写的东西Ӟ有几点让我印象深刅R第一点(也是和本书最有关的)是,CQ我甚至比那时更加确信我试图去阐q的要点在本质上的正性。随后的一些年中,许多行的Y件开发方法增Z其中的许多观点,q支持了我的信念。最明显的(或许也是最不重要的Q是面向对象~程语言的流行。现在,除了C++外,出现了许多其他的面向对象~程语言。另外,q有一些面向对象设计符P比如QUML。我关于面向对象语言之所以得到流行是因ؓ它们允许在代码中直接表现出更兯辑֊的设计的论点Q现在看来有点过时了?nbsp;

重构的概?#8212;—重新l织代码基础Q之更加健壮和可重?#8212;—同样也和我的关于设计的所有方面的内容都应该是灉|的ƈ且在验证设计时允许改变的论点怼。重构只是提供了一个过E以及一l如何去改善已经被证实具有缺L设计的准则?nbsp;

最后,文中有一个敏捷开发的ȝ概念。虽然极限编E是q些新方法中最知名的一个,但是它们都具有一个共同点Q它们都承认源代码是软g开发工作中的最重要的品?nbsp;

另一斚wQ有一些观?#8212;—其中的一些我在论文中略微谈到q?#8212;—在随后的一些年中,Ҏ来说变得更加重要。第一个是构架Q或者顶层设计的重要性。在论文中,我认为构架只是设计的一部分内容Qƈ且在构徏/试循环对设计进行验证的q程中,构架需要保持可变。这在本质上是正的Q但是回惌v来,我认为我的想法有点不成熟。虽然构?试循环可能揭示出构架中的问题,但是更多的问题是常常׃改变需求而表现出来的?一般来_设计软g是困隄Qƈ且新的编E语aQ比如:Java或者C++Q以及图形化的符P比如QUMLQ对于不知道如何有效C用它的h来说Q都没有多大的帮助。此外,一旦一个项目基于一个构架构Z大量的代码,那么对该构架q行基础性的更改Q常常相当于丢弃掉该目q新开始一个,q就意味着该项目没有出现过。即佉K目和机构在根本上接受了重构的概念Q但是他们通常仍然不愿意去做一些看h像是完全重写的事情。这意味着W一ơ就把它作对Q或者至是接近对)是重要的Qƈ且项目变得越大,p要如此。幸q的是,软g设计模式有助于解册斚w问题?nbsp;

q有其他一些方面的内容Q我认ؓ需要更多地一下,其中之一是辅助文档Q尤其是构架斚w的文档。虽然源代码是设计Q但是试图从源代码中得出构架Q可能是一个o人畏惧的体验。在论文中,我希望能够出C些Y件工h帮助软g开发者自动地l护来自源代码的辅助文档。我几乎已经攑ּ了这个希望。一个好的面向对象构枉常可以使用几幅图以及少许的十几|本描q出来。不q,q些图(和文本)必须集中于设计中的关键类和关pR糟p的是,对于软g设计工具可能会变得够聪明,以至于可以从源代码的大量l节中提取出q些重要斚w的内容这一点,我没有看CQ何真正的希望。这意味着q得必须׃h来编写和l护q种文档。我仍然认ؓQ在源代码完成后Q或者至是在编写源代码的同时去~文档,要比在编写源代码之前ȝ写文档更好一些?nbsp;

最后,我在论文的最后谈CC++是编E?#8212;—q且因此是Y件设?#8212;—艺术的一个进步,但是q需要更大的q步。就我完全没有看到语言中出CQ何真正的~程q步来挑战C++的流行,那么在今天,我会认ؓq一点甚臌比我首次~写它时更加正确?nbsp;

——Jack Reeves, 2002q???nbsp;

zhb8015 2012-04-13 15:46 发表评论
]]>
վ֩ģ壺 ѿһһƬ| պa߹ۿ| Ʒ޾Ʒպͼ| ձŷҹƬŮԱ | aרav| 99ƵƷƵ7| ѲƵ| ²߾ƷƵѹۿ| ߵƵѹۿ| ɫһ | 99reƵѹۿ| þwww˳ɿƬ| 99þۺϾƷ| ۺһպ| ŷУ԰Ķ| ŷƵ| AV뾫Ʒ| þþƷƷ| ޹˾þۺҰ| AƵվ| av߿վ| һëƬ߹ۿ| 97Ƶѹۿ2| òֻƵ| Ʒһvr| WWWƵ߹ۿ| Ʒ͵Ƶѹۿ| һësuvÿĹվ | ĻƵ߿| 99ֻоƷƵѿ| ˾ƷѾþþþ| 2019Ļ߹ۿ| ˿Ƶ| ֻˬִƵ| Ʒþþþþù| ӰӾ߹ۿȫ | ëƬվ߹ۿ| ձ˻ʿxxxxƵ| aػƵƬƵ| ޹aƷ| ˾þۺӰԺ|