陋居

淡薄名利,修身养性

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  31 Posts :: 1 Stories :: 4 Comments :: 0 Trackbacks

常用链接

留言簿

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

#

好书列表 V2.1
jacinth(jacinth@m2-68.ym.edu.tw)
2000-1-14 16:09:40


书评内容
    
                     
 蒋按:这是台湾一名研究生的推荐 书目,看起来很不错,不过很多书我都没有见过, 
       国内买原版书太难了,而且也太贵了!
       如果你有心目中的好 书,不妨也发言吧!

===============================================================================
1) 本 列表乃个人涉猎范围内所列的书目,所以在其他很多topic上并没有整理,目前整理
   出来的书目,分为以下主题:

    ==& gt;系统网路管理(含系统安全)  程式系统工具  Shell程式设计
    ==>作业系统通论  COMPILER  Unix作 业系统
    ==>系统网路程式设计(含Pthread)
    ==>程式语 言: C  C++  Perl  Assembly
    ==>Data-structure  Algorithm
    ==>Architecture

2) 有 网友问说为什麽不把全部的相关书籍都列出来,嗯,有几个原因啦....
   一是真的书太多了,全部列出来的结果是: 我会累死
   二 是我希望列出来的书单内的东西基本上都是我涉猎过的,或是网友推荐的(我会注明)
   而不希望把全部的书都列出来。若全列出来,结果会不知道谁 好谁不好。当然凭我一已
   所学要来要求这份文件的完整性是太勉强了点,因能力实在有限,关於这个问题就只好
   祈盼网友们的不吝指 教了

3) 会想整理这份文件是因为当初学弟妹们在问要入门unix要看什麽书较好,而刚好那时又
   没事,就顺手整理了一份起 来。後来看到满多人在网路上问这方面的问题,心想乾脆就
   把整理出来的东西再美化一下,再加上一些网路上大家介绍的书......最後就成了 这份
   小小的文件。

   谢谢很多网友在我前几次post後给我的建议,还有你们推荐的书,让这份文件不至成为
   只 有我这只井底之蛙知道的东西......

   我想这份文件应该能给一些人帮助,毕竟所列的书都是那些topic 上数一数二的好书。
   为 了方便使用,我以个人的学习经验,为它们粗做分类,再加上一点点个人的看法,像
   它是入门书或是进阶书,它适合什麽等。

   今 後将以大概一个月一次的速度对这份文件做修改,并post出来

4) 若您有任何好书想和大家分享,可直接reply在版上或是mail给 我,我会在下次整理时
   把它们加进去。若对内容有任何不满,也烦请来信告知,有劳了.....谢谢

                                                     by jacinth
                            jacinth@m2-68.ym.edu.tw

===============================================================================
以 下为网路上众网友推荐的网路书局....(抱歉,私自放入....)

www.a1books.com
www.acses.com
以 上两者为用来比较各家网路书局售价用的网站

www.addall.com
www.amazon.com
www.barnesandnoble.com
www.bookpool.com
www.cbooks.com
www.clbooks.com
www.computerliteracy.com

===============================================================================
【系 统,网路管理】
1) Learning the Unix Operating System              

1565923901 O'reilly/1997-4ed
        *** 强力推荐给想入门unix的网友们!!
           就只有薄薄的不到100页,在书局偶然发现....深觉其内容适合初学者
           相 信只要读它,一个下午就可以了解基本UNIX的操作!!


2) Unix : Visual Quickstart Guide          

0201353954 A-W/1998-1ed
    *** 强力推荐给想入门unix的网友们!!
       比上面那本大了点,也是写的很浅显易懂,大概一两天就是对unix有基本的
       认 识!!
3) Essential System Administration:                

1565921275 O'reilly/1996-2ed
        Help for Unix System Administrators
        *** 网友推荐,unix入门书....


4) TCP/IP Network Administration                   

1565923227 O'reilly/1998-2ed
        *** 网管入门书,一开始网路的概念介绍得棒!!

5) Unix system administration handbook             

0131510517  PTH/1995-2ed
        *** 网路上昵称其为"红皮书",系统,网路都说的十分详细,无可挑惕!!
           进阶用书,不适合初学者

6) Sendmail                                        

1565922220 O'reilly/1997-2ed
        *** 十分详细,且平易近人,是这个主题的bible(我觉得啦)


7) DNS and BIND                                    

1565925122 O'reilly/1998-3ed
    *** 这一版加入了BIND 8与Perl module


1) The complete FreeBSD                            

1517162272 Walnut/1998-3ed
        *** 最新版出来了(for 3.0)!!但台湾还只看得到for 2.2.7的版本....另外,
       我觉得handbook更好....


1) A Practical Guide to Linux                      

0201895498 A-W/1997-1ed
        *** (A Practical Guide to UNIX的再版)
           Linus写序提到, 他当初就是用这本书学 Unix, 没想到七年後很荣幸的为
           作者写序.

2) Running Linux                                   

O'Reilly/1999-3ed


3) Linux Network Administrator's Guide             

O'Reilly/1999-2ed
*** 新版书出来罗!!只是我没有找到它们的ISBN码,请各位们行到书局找
       都是1999年出的就是了(2和3)
===> LINUX的书好多喔!!而我又很久没玩了,所以没法提供更多的书目。以上三本书乃
    LINUX各部分较具代表性的高水准作品,希望有研究 的网友提供更多更好的书目,
    让大家饱饱眼福!!


1) Solaris System Administrator's Guide            

157870040X Macmillan/1998-2ed


2) Solaris Advanced System Administrator's Guide   

1578700396 Macmillan/1998-2ed


3) Solaris Performance Administration :            

0070117683 McGraw/1998-1ed
        Performance Measurement, Fine Tuning, and Capacity Planning for
        Releases 2.5.1 and 2.6 Solaris Servers
        *** 以上三本书为网友所提供。但amazon上对第二本的评价差到极点,大家叁考
           看看。小弟学习时深觉其随机附的manual 十分的精彩,十分的棒,有那份
           manual就十分足够了


4) Sun Performance and Tuning:Java and Internet    

0130952494 PTH/1998-2ed
    *** 网友fjchang推荐!!评语:
       市面上所有针对 UNIX performance tuning 的书中,以这一本 对 Solaris
       写得最深入,风评绝非上述第三本可比拟


5) Configuration and Capacity Planning for Solaris 

0133499529 PTH/1997-1ed
    Servers
    *** 网友fjchang推荐!!评语:
       此书几乎没有任何 UNIX 指令出现,但却是一本硬书,提到许多规划方面
       应 注意的事项。本书对 Storage System 描写之详尽,无任何书可匹敌,
       书评均认为此处乃本书最成功之处,单单这个部分 就值回整本书价了。上
       一本书作者 Adrian 受本书作者之薰陶与影响甚深。

【系统安全】
1) maximum Security:A hacker's guide to            

0672313413 Sams/1998-2ed
        protecting your internet site and network


2) Cracking Des : Secrets of Encryption            

1565925203 O'reilly/1998-1ed
        Research, Wiretap Politics & Chip Design


3) Practical Unix and Internet Security            

1565921488 O'reilly/1996-2ed


4) Building Internet Firewalls             

1565921240 O'reilly/1995-1ed
===& gt;基本上....网路是最大也是最好的一本书....

【Shell 程式设计】
1) UNIX SHELLS by example                          

0134608666 PTH/1998-1ed
        *** 错误颇多,但却是一本好的shell programming入门书
===>对於shell programming,其实很多介绍 unix的书上面都会有简单的介绍,但完全讨论
    这个主题的好像只有这本。它另外还有教awk,grep,sed,都很详细

【程 式&系统工具】
1) managing projects with make                     

0937175900 O'reilly/1993-2ed
        *** 对make有详细的说明


2) programming with GUN SOFTWARE                   

1565921127 O'reilly/1997-1ed
        *** 个人强力推荐!!教你用emacs,gcc,gdb,gmake....


3) UNIX power tools                                

1565922603 O'reilly/1997-2ed
        *** 网友推荐,有很多的实用技巧.....

【作业系统通论】
1) Operating System concepts                       

0201591138 A-W/1997-5ed
        *** 大学教科书(operating system),俗称"恐龙书"。很棒的作业系统入门书


2) Modern operating system                         

9813076623 PTH/1996-2ed
        *** 大学教科书,配合恐龙书服用,效果加倍


3) Operating systems design and implememtation     

0136301959 PTH/1997-2ed
        *** 大学教科书(advanced operating system)
           教你写一个完整的OS(Minix),不含网路系统


4) Distributed Operating systems                   
0131439340 PTH/1995-2ed

【Data structure and algorithm】
1) Fundamemtals of DATA STRUCTURES IN C        

0716782502 CS/1993-1ed(?)
    *** 大学教科书(data structure),另有PASCAL,C++版本
  //蒋按:有大陆版


2) Introduction to algorithms              

0262031418 MIT/1990-1ed
    *** 大学教科书(algorithm)


3) Computer Algorithms/C++             

0716783150 CS/1996-1ed
    *** 大学教科书(algorithm),另有PASCAL版本。
       不必我说,IA和CA两本都是超棒的!!都拿来读读,多读几 次......
       阅读顺序由个人选择。我选CA->IA
  //蒋按:有大陆版


4) The Art of Computer Programming (Vol 1):    

0201896834 A-W/1997-3ed
    Fundamental Algorithms


5) The Art of Computer Programming (Vol 2):        

0201896842 A-W/1997-3ed
    Seminumerical Algorithms


6) The Art of Computer Programming (Vol 3):        

0201896850 A-W/1998-2ed
    Sorting and Searching
    *** 以上三本....我不必介绍了吧??(好想找时间完整的研究一次....)


7) Distributed Algorithms              

1558603484 M-K/1997-1ed
    *** 还没玩完,但只想说: 真的好棒!!

【Unix】
1) Unix internals -the new frontiers               

0131019082 PTH/1996-1ed
        *** 深入UNIX.....进阶用书(SVR4 BSD都有讨论)


2) 4.4 BSD Operating System                        

0201549794 A-W/1996-2ed
        *** 同上,但以4.4BSD为主题


3) The Magic Garden Explained : The                

0130981389 PTH/1994-1ed
        Internals of Unix System V Release 4 : An Open Systems Design
        *** 同上,但以SVR4为主题。台湾没有书,我是向国外订的
           (听说台大图书馆有喔~~~)


4) The Design of the UNIX operating system         

0132017997 PTH/1986-1ed
        *** 同上,BACH着,很多教科书都指名它为reference....


5) Lions' Commentary on Unix : With Source Code    

1573980137 P-t-P/1996-6th


6) Unix Internals : A Practical Approach           

020187721X A-W/1996-1ed


7) Unix Systems for Modern Architecture            

0201633388 A-W/1994-1ed
        : Symmetric Multiprocesssing and Caching for Kernel Programmers


8) The Linux Kernel Book                           

0471981419 Wiley/1998-1ed
    *** 我觉得翻译得怪怪的(因为它是由别国语言翻成英文)....
       最好先对kernel有多些概念再读会较好....


9) Linux Kernel Internals                          

0201331438 A-W/1997-2ed
        *** 讨论linux kernel的书,恐龙书上在linux部分的reference,个人推荐


10)Linux Device Drivers                

1565922921 O'reilly/1998-1ed
    *** 网友推荐,作者是来自义大利的骇客....

【系统,网路程式设计】
1) Advanced programming in the UNIX environment    

0201563177 A-W/1992-1ed
        ***Richard Steven 所着,十分适合对系统,C有基础的人,亦是一本好的manual


2) UNIX systems programming(for SVR4)              

1565921631 O'relly/1997-1ed
        *** 网路上评语为其讨论内容过杂,但我觉得满适合拿来当reference


3) internetworking with TCP/IP vol 1:              

0132169878 PTH/1995-3ed
        Principles, Protocols, and Architecture


4) internetworking with TCP/IP vol 2:              

0130102210 PTH/1999-3ed
        design,implementation and internals


5) internetworking with TCP/IP vol 3:              

0132621487 PTH/1996-2ed
        client-server programming and application
        *** 以上三本乃comer所着,属bible级读物。为大学教科书.....
       vol1讲TCPIP的原理,vol2讲TCPIP的 implementation,vol3讲APP的写作
       另外vol3分成三个版本,分别为 BSDsockets,winsock,TLI


6) TCP/IP illustrated vol 1                        0201633469 A-W/1994-1ed
7) TCP/IP illustrated vol 2                        020163354x A-W/1995-1ed
8) TCP/IP illustrated vol 3                        0201634953 A-W/1996-1ed
        *** 以上三本乃Richard Steven所着,影响小弟甚深,bible级读物。
           vol1讲TCPIP的原理,vol2讲 TCPIP的implementation,vol3讲APP的写作


9) UNIX network programming                        

9813026537 PTH/1994-1ed


10)UNIX network programming                        

0136493289 PTH/1998-2ed
        vol 1:networking API:Sockets and XTI
        *** 以上两本亦为Richard Steven所着,第一本为第一版,小弟无缘
           第二本为第二版,强力推荐!!


11)UNIX network Programming                        

0130810819 PTH/1998-2ed
        vol 2: Interprocess Communications
        *** 以IPC为主题,觉得"杂"了点....但不失为一代宗师之作


12)Programming With Curses             

0937175021 O'reilly/1986-1ed
    *** 讲unix下curses函式库,若你要控制terminal,很好的叁考书


13)Thread Time:The Multithreaded Programming Guide 

0131900676 PTH/1996-1ed


14)Multithreaded Programming With Pthreads     

0136807291 PTH/1997-1ed


15)Programming With Posix Threads          

0201633922 A-W/1997-1ed


16)Programming With Threads            

0131723898 PTH/1995-1ed


17)Pthreads Programming                

1565921151 O'reilly/1996-1ed
    *** 以上五本书都是以pthread为主题,个人推荐(14)(16),其他的也很不错,只是
       我没细读,不很清楚....

【程 式语言:C】

1) C : How to Program                              

0132261197 PTH/1994-2ed
        *** 教科书,初学C语言可考虑


2) the c progamming language                       

0131103628 PTH/1988-2ed
        ***K&R 所着,乃C之bible中的bible,为c programmer 必读之书藉。
           惟不适合初学者,进阶用书


3) The C Answer Book                   

0131096532 PTH/1988-2ed
    ***K&R 的解答本....好贵:<....所以不买了....:)


4) C: The Complete Reference               

0078821010 McGraw/1995-3ed
    *** 评价直逼K&R的一本好书....可能也不适合初学者(我没看过)

【程式语言:C++】

1) C++ primer                                      

0201824701 A-W/1998-3ed
        *** 一本十分适合初学者拿来学习的书....
       以下为候捷老师的评语:
       在「C++ 百科」类书中, 与 The C++ Programming Language 齐名,
       亲和性较佳。老字号,有口碑。副作 者 Josee Lajoie 是 ANSI/ISO
       C++ Standard 委员会的核心语言工作小组主席,因此本书在与
       C++ Standard 的 密合度上,当可令人放心。


2) the C++ programming language                    

0201889544 A-W/1998-3ed
        *** 以下为候捷候老师评语:
       属「C++ 百科」级的书。此书可谓 C++ 原典,具权威性,由 C++ 之父
       所 着。连 ANSI C++ 制定时都得叁考此书。不论是内容深度或文字风格,
       都不适合生手,但很适合做为进阶研究或叁考查阅壮胆之 用。原文书之
       code 编排令我感到不舒服,行文之间学院派的味道颇重。本书为与
       C++ Standard 相 映合,有份量极重之 errata,务请读者上网下载。


3) Thinking in C++                 

0139177094 PTH/1995-1ed
    *** 以下为候捷候老师评语:
       也属「C++ 百科」类书。口碑甚佳,唯目录所列页次与实际页次 offset 4
       1/e 年 代过於陈旧,当此 C++ Standard 已定案之际,应属过时。
       ps.第二版将不会有以上现象,但还未完书
  // 蒋按:大陆版有Thinking in Java

4) C++ Standard                    

抱 歉我查不到资料....
    ***以下为候捷候老师评语:
       醉心学术以及喜欢看 definition 的人,一定会喜 欢。有此资料在手,
       与人争辩 C++ 时可使用最大的胆子和最大的分贝。电子版(PDF 格式)
       可 於 http://webstore.ansi.org/ 购得,US$ 18.0。列印出来装订得
       美美的,摆在架上足以唬人。


5) Effective C++, 2nd Edition:             

0201924889 A-W/1998-2ed
    50 Specific Ways to Improve Your Programs and Designs
    *** 以下为候捷候老师评语:
       以条列方式列出 50 条宝贵的程式经验。每一条均有深入的原理说明。
       适合 有 C++ programming 经验者。
  //蒋按:有大陆版

6) More Effective C++:                 

020163371x A-W/1996-1ed
    35 More Ways to Improve Your Programs and Designs
    *** 以下为候捷候老师评语:
       以条列方式列出 35 条宝贵的程式经验。每一条均有深入的原理说明。
       适合 有 C++ programming 经验者。


7) Inside the C++ Object Model                 

0201834545 A-W/1996-1ed
    *** 以下为候捷候老师评语:
       适合给已有 C++ 经验的人阅读。可为你扎下 C++ 内部机制的深厚基础。
       原文 书笔误极多(100 个以上,大大小小),影响阅读甚巨,建议读中译
       本。对大部份人而言,chap3,4 可带来最大边际效益。


8) The Design and Evolution of C++                 

0201543303 A-W/1994-1ed


9) The Annotated C++ Reference Manual              

0201514591 A-W/1990-1ed


10)Advanced C++ Programming Styles and Idioms      

0201548550 A-W/1991-1ed


11)C++ Programming Style                           

0201563657 A-W/1992-1ed


12)C++ Strategies and Tactics                      

0201563827 A-W/1993-1ed
        *** 以上五本书为网友推荐,都算是进阶用书

【程式语言:perl】


1) Learning Perl                   

1565922840 O'reilly/1997-2ed
    *** 最易上手的入门书,有程式基础的人三天内就可学到一些东西(亲身经验....)


2) Programming Perl                

1565921496 O'reilly/1996-2ed
    ***Perl's father 亲 手写的书,若先看过(1),会很快吸收


3) Advanced Perl Programming               

1565922204 O'reilly/1997-1ed


4) The Perl Cookbook                   

1565922433 O'reilly/1998-1ed


5) Web Client Programming with Perl        

156592214X O'reilly/1997-1ed


6) Perl Resource Kit-Unix Edition          

1565923707 O'reilly/1997-1ed


7) Learning Perl/Tk                

1565923146 O'reilly/1999-1ed

【程 式语言:Assembly】

1) IBM PC Assembly Language and Programming        

0137566107 PTH/1997-4ed
    *** 初学用书....

【Computer Architecture】

1) Computer Organization and Design :              

1558604286 Morgan/1997-2ed
        The Hardware/Software Interface
    *** 大学教科书(计算机组织),这个topic的入门书


2) Computer Architecture :                         

1558603298 Morgan/1996-2ed
        A Quantitative Approach
    *** 大学教科书(计算机组织),这个topic的入门书


3) Computer Architecture : 

Concepts and Evolution  0201105578 A-W/1997-1ed

【compiler】
1) Crafting a Compiler With C              

0805321667 A-W/1991-1ed
    *** 大学教科书(compiler)


2) Compilers Principles, Techniques, and tools     

0201100886 A-W/1986-1ed
    *** 大学教科书(compiler),个人推荐!!因为我用它学的:>

posted @ 2010-09-17 08:26 eircQ 阅读(483) | 评论 (0)编辑 收藏

一位软件工程师的6年总结

 

--------------------------------------------------------------------------------

 

2007-10-29 21:47:12 标签:程序人生   [推送到技术圈]

 

 

 一位软件工程师的6年总结     

 

 

作者:成晓旭

 

(声明:欢迎转载,请保证文章的完整性)

 

“又是一年毕 业时”,看到 一批批学子离开人生的象牙塔,走上各自的工作岗位;想想自己也曾经意气风发、踌躇满志,不觉感叹万千……本文是自己工作6年的经历沉淀或者经验提炼,希望对所有的软件工程师们有所帮助,早日实现自己的人生目标。本文主要是关于软件开发人员如何提高自己的软件专业技术方面的具体建议,前面几点旨在确定大的方向,算是废话吧。

 

谨以此文献给那个自己为你奉献3年青春与激情的开发团队。还有团队成员:PPL、YT、YK 、TYF、LGL、CHL、CDY、CB、DPD。

 

1、 分享第一条经 验:“学历代表过去、能力代表现在、学习力代表未来。”其实这是一个来自国外教育领域的一个研究结果。相信工作过几年、十几年的朋友对这个道理有些体会吧。但我相信这一点也很重要:“重要的道理明白太晚将抱憾终生!”所以放在每一条,让刚刚毕业的朋友们早点看到哈!

 

2、 一定要确定自己的发展方向,并为此目的制定可行的计划。不要说什么,“我刚毕业,还不知道将来可能做什么?”,“跟着感觉走,先做做看”。因为,这样的观点会通过你的潜意识去暗示你的行为无所事事、碌碌无为。一直做技术,将来成为专家级人物?向管理方向走,成为职业经理人?先熟悉行业和领域,将来自立门户?还是先在行业里面混混,过几年转行做点别的?这很重要,它将决定你近几年、十年内“做什么事情才是在做正确的事情!”。

 

3、 软件开发团队中,技术不是万能的,但没有技术是万万不能的!在技术型团队中,技术与人品同等重要,当然长相也比较重要哈,尤其在MM比较多的团队中。在软件项目团队中,技术水平是受人重视和尊重的重要砝码。无论你是做管理、系统分析、设计、编码,还是产品管理、测试、文档、实施、维护,多少你都要有技术基础。算我孤陋寡闻,我还真没有亲眼看到过一个外行带领一个软件开发团队成功地完成过软件开发项目,哪怕就一个,也没有看到。倒是曾经看到过一个“高学历的牛人”(非技术型)带一堆人做完过一个项目,项目交付的第二天,项目组成员扔下一句“再也受不了啦!”四分五裂、各 奔东西。那个项目的“成功度”大家可想而知了。

 

4、 详 细制定自己软件开发专业知识学习计划,并注意及时修正和调整(软件开发技术变化实在太快)。请牢记:“如果一个软件开发人员在1、2年内都没有更新过自己的知识,那么,其实他已经不再属于这个行业了。”不要告诉自己没有时间。来自时间管理领域的著名的“三八原则”告诫我们:另外的那8小时如何使用将决定你的人生成败!本人自毕业以来,平均每天实际学习时间超过2小时。

 

5、 书籍是人类进步的阶梯,对软件开发人员尤其如此。书籍是学习知识的最有效途径,不要过多地指望在工作中能遇到“世外高人”,并 不厌其烦地教你。对于花钱买书,我个人经验是:千万别买国内那帮人出的书!我买的那些家伙出的书,!00%全部后悔了,无一本例外。更气愤的是,这些书在二手市场的地摊上都很难卖掉。“拥有书籍并不表示拥有知识;拥有知识并不表示拥有技能;拥有技能并不表示拥有文化;拥有文化并不表示拥有智慧。”只有将书本变成的自己智慧,才算是真正拥有了它。

 

6、 不要仅局限于对某项技术的表面使用上,哪怕你只是偶尔用一、二次。“对任何事物不究就里”是任何行业的工程师所不应该具备的素质。开发Windows应用程序,看看Windows程序的设计、加载、执行原理,分析一下PE文件格式,试试用SDK开发从头开发一个Windows应用程序;用VC++、Delphi、Java、.Net开发应用程序,花时间去研究一下MFC、VCL、J2EE、.Net它们框架设计或者源码;除了会用J2EE、JBoss、Spring、Hibernate等等优秀的开源产品或者框架,抽空看看大师们是如何抽象、分析、设计和实现那些类似问题的通用解决方案的。试着这样做做,你以后的工作将会少遇到一些让你不明就里、一头雾水的问题,因为,很多东西你“知其然且知其所以然”!

 

7、 在一种语言上编程,但别为其束缚了思想。“代码大全”中说:“深入一门语言编程,不要浮于表面”。深入一门语言开发还远远不足,任何编程语言的存在都有其自身的理由,所以也没有哪门语言是“包治百病”的“灵丹妙药”。编程语言对开发人员解决具体问题的思路和方式的影响与束缚的例子俯拾皆是。我的经验是:用面对对象工具开发某些关键模块时,为什么不可以借鉴C、C51、汇编的模块化封装方式?用传统的桌面开 发工具(目前主要有VC++、Delphi)进行系统体统结构设计时,为什么不可以参考来自Java社区的IoC、AOP设计思想,甚至借鉴像Spring、Hibernate、JBoss等等优秀的开源框架?在进行类似于实时通信、数据采集等功能的设计、实现时,为什么不可以引用来自实时系统、嵌入式系统的优秀的体系框架与模式?为什么一切都必须以个人、团队在当然开发语言上的传统或者经验来解决问题???“他山之石、可以攻玉”。

 

8、 养成总结与反思的习惯,并有意识地提炼日常工作成果,形成自己的个人源码库、解决某类问题的通用系统体系结构、甚至进化为框架。众所周知,对软件开发人员而言,有、无经验的一个显著区别是:无经验者完成任何任务时都从头开始,而有经验者往往通过重组自己的可复用模块、类库来解决问题(其实这个结论不应该被局限在软件开发领域、可以延伸到很多方面)。这并不是说,所有可复用的东西都必须自己实现,别人成熟的通过测试的成果也可以收集、整理、集成到自己的知识库中。但是,最好还是自己实现,这样没有知识产权、版权等问题,关键是自己实现后能真正掌握这个知识点,拥有这个技能。

 

9、 理论与实践并重,内外双修。工程师的内涵是:以工程师的眼光观察、分析事物和世界。一个合格的软件工程师,是真正理解了软件产品的本质及软件产品研发的思想精髓的人(个人观点、欢迎探讨)。掌握软件开发语言、应用语言工具解决工作中的具体问题、完成目标任务是软件工程师的主要工作,但从软件工程师这个角度来看,这只是外在的东西,并非重要的、本质的工作。学习、掌握软件产品开发理论知识、软件开发方法论,并在实践中理解、应用软件产品的分析、设计、实现思想来解决具体的软件产品研发问题,才是真正的软件工程师的工作。站在成熟理论与可靠方法论的高度思考、分析、解决问题,并在具体实践中验证和修正这些思想与方式,最终形成自己的理论体系和实用方法论。

 

10、心态有多开放,视野就有多开阔。不要抱着自己的技术和成果,等到它们都已经过时变成垃圾了,才拿出来丢人现眼。请及时发布自己的研究成果:开发的产品、有创意的设计或代码,公布出来让大家交流或者使用,你的成果才有进化和升华的机会。想想自己2000年间开发的那些Windows系统工具,5、6年之后的今天,还是那个样子,今天流行的好多Windows系统工具都比自己的晚,但进化得很好,且有那么多用户在使用。并且,不要保守自己的技术和思想,尽可能地与人交流与分享,或者传授给开发团队的成员。“与人交换苹果之后,每个人还是只有一个苹果;但交换思想之后,每个人都拥有两种思想”,道理大家都懂,但有多少人真正能 做到呢?

 

11、尽量参加开源项目的开发、或者与朋友共同研制一些自己的产品,千万不要因为没有钱赚而不做。网络早已不再只是“虚拟世界”,网上有很多的开源项目、合作开发项目、外包项目,这都是涉猎工作以外的知识的绝好机会,并且能够结识更广的人缘。不要因为工作是做ERP,就不去学习和了解嵌入式、实时、通信、网络等方面的技术,反过来也是一样。如果当他别人拿着合同找你合作,你却这也不会,那也不熟时,你将后悔莫及。

 

12、书到用时方恨少,不要将自己的知识面仅仅局限于技术方面。诺贝尔经济学奖得主西蒙教授的研究结果表明: “对于一个有一定基础的人来说,他只要真正肯下功夫,在6个月内就可以掌握任何一门学问。”教育心理学界为感谢西蒙教授的研究成果,故命名为西蒙学习法。可见,掌握一门陌生的学问远远没有想想的那么高难、深奥。多方吸取、广泛涉猎。极力夯实自己的影响圈、尽量扩大自己的关注圈。财务、经济、税务、管理等等知识,有空花时间看看,韬光养晦、未雨绸缪。

 

13、本文的总 结与反思:

 

A:不要去做技术上的高手,除非你的目标如此。虽然本文是关于提高软件开发知识的建议,做技术的高手是我一向都不赞同的。你可以提高自己的专业知识,但能胜任工作即止。

 

B:提高软件知识和技术只是问题的表面,本质是要提高自己认识问题、分析问题、解决问题的思想高度。软件专业知识的很多方法和原理,可以很容易地延伸、应用到生活的其它方面。

 

C:在能胜任工作的基础上,立即去涉猎其它领域的专业知识,丰富自己的知识体系、提高自己的综合素质,尤其是那些目标不在技术方面的朋友。


posted @ 2010-09-02 09:37 eircQ 阅读(91) | 评论 (0)编辑 收藏

 但是如果你希望,提前在5年内、3年内甚至1年内使你的收入加倍,你必须先使你的生产力加倍,然后收入加倍的美梦才可能成真。

    如何使生产力加倍呢?美国职业生涯规划与时间管理专家Brian
Tracy,集20年实务工作经验与研究,发现能使你生产力加倍 的7个工作秘诀:


    一、全心投入工作(work harder at what you
            do):当你工作时,一定要全心投入,不要浪费时间,不要把工作场所当成社交场合。光这个秘诀,如果你能长期实践,就能使你的生产力加倍。


    二、工作步调快(work
            faster):养成一种紧迫感,一次专心做一件事,并且用最快的速度完成,之后,立刻进入下一件工作。养成这习惯后,你会惊讶地发现,一天所能完成的工 作量居然是如此地惊人。


    三、专注于高附加值的工作(work on higher-value
            activities):你要记住工作时数的多寡不见得与工作成果成正比。精明的老板或是上司关心的是你的工作数量及工作品质,工作时数并非重点。因此聪 明的员工,会想办法找出对达成工作目标及绩效标准有帮助的活动,然后投入最多时间与心力在这些事情上面。投入的时间愈多,每分钟的生产力就愈高,工作绩效 也就提高,自然赢得老板及上司的赏识与重用,加薪与升迁在望。


    四、熟练工作(do things you are better
            at):你找出最有价值的工作项目后,接着要想办法,通过不断学习、应用、练习,熟练所有工作流程与技巧,累积工作经验(一句话解决KNOW
            HOW的问题)。你的工作愈纯熟,工作所需的时间就愈短;你的技能愈熟练,生产力就提升得愈快。


    五、集中处理(bunch your
            tasks):一个有技巧的工作人,会把许多性质相近的工作或是活动,例如,收发E-MAIL、写信、填写工作报表、填写备忘录等等,集中在同一个时段来 处理,这样会比一件一件分开在不同时段处理,节省一半以上的时间,同时也能提高效率与效能。


    六、简化工作(simplify your
            work):尽量简化工作流程,将许多分开的工作步骤加以整合,变成单一任务,以减少工作的复杂度,另外,运用授权或是外包的方式,避免把时间花费在低价 值的工作上。


    七、比别人工作时间长一些(work longer
            hours):早一点起床,早点去上班,避开交通高峰;中午晚一点出去用餐,继续工作,避开排队用餐的人潮;晚上稍微留晚一些,直到交通高峰时间已过,再 下班回家。如此一天可以比一般人多出2至3个小时的工作时间,而且不会影响正常的生活步调。善用这些多出来的时间,可以使你的生产力加倍,进而使你的收入 加倍。一个成功的人,通常是一个行动派的人,一旦懂得提升生产力的方法,就会将这7个小秘诀,默记在心,不断地应用、练习,直到成为工作、生活的习惯为 止。只要养成这个习惯,你的生产力一定会提高,收入也会加倍。


posted @ 2010-09-02 09:29 eircQ 阅读(110) | 评论 (0)编辑 收藏

1 快速排序(QuickSort)

快速排序是一个就地排序,分而治之,大规模递归的算法。从本质上来说,它是归并排序的就地版本。快速排序可以由下面四步组成。

(1) 如果不多于1个数据,直接返回。

(2) 一般选择序列最左边的值作为支点数据。

(3) 将序列分成2部分,一部分都大于支点数据,另外一部分都小于支点数据。

(4) 对两边利用递归排序数列。

快速排序比大部分排序算法都要快。尽管我们可以在某些特殊的情况下写出比快速排序快的算法,但是就通常情况而言,没有比它更快的了。快速排序是递归的,对于内存非常有限的机器来说,它不是一个好的选择。

2 归并排序(MergeSort)

归并排序先分解要排序的序列,从1分成2,2分成4,依次分解,当分解到只有1个一组的时候,就可以排序这些分组,然后依次合并回原来的序列中,这样就可以排序所有数据。合并排序比堆排序稍微快一点,但是需要比堆排序多一倍的内存空间,因为它需要一个额外的数组。

3 堆排序(HeapSort)

堆排序适合于数据量非常大的场合(百万数据)。

堆排序不需要大量的递归或者多维的暂存数组。这对于数据量非常巨大的序列是合适的。比如超过数百万条记录,因为快速排序,归并排序都使用递归来设计算法,在数据量非常大的时候,可能会发生堆栈溢出错误。

堆排序会将所有的数据建成一个堆,最大的数据在堆顶,然后将堆顶数据和序列的最后一个数据交换。接下来再次重建堆,交换数据,依次下去,就可以排序所有的数据。

4 Shell排序(ShellSort)

Shell排序通过将数据分成不同的组,先对每一组进行排序,然后再对所有的元素进行一次插入排序,以减少数据交换和移动的次数。平均效率是O(nlogn)。其中分组的合理性会对算法产生重要的影响。现在多用D.E.Knuth的分组方法。

Shell排序比冒泡排序快5倍,比插入排序大致快2倍。Shell排序比起QuickSort,MergeSort,HeapSort慢很多。但是它相对比较简单,它适合于数据量在5000以下并且速度并不是特别重要的场合。它对于数据量较小的数列重复排序是非常好的。

5 插入排序(InsertSort)

插入排序通过把序列中的值插入一个已经排序好的序列中,直到该序列的结束。插入排序是对冒泡排序的改进。它比冒泡排序快2倍。一般不用在数据大于1000的场合下使用插入排序,或者重复排序超过200数据项的序列。

6 冒泡排序(BubbleSort)

冒泡排序是最慢的排序算法。在实际运用中它是效率最低的算法。它通过一趟又一趟地比较数组中的每一个元素,使较大的数据下沉,较小的数据上升。它是O(n^2)的算法。

7 交换排序(ExchangeSort)和选择排序(SelectSort)

这两种排序方法都是交换方法的排序算法,效率都是 O(n2)。在实际应用中处于和冒泡排序基本相同的地位。它们只是排序算法发展的初级阶段,在实际中使用较少。

8 基数排序(RadixSort)

基数排序和通常的排序算法并不走同样的路线。它是一种比较新颖的算法,但是它只能用于整数的排序,如果我们要把同样的办法运用到浮点数上,我们必须了解浮点数的存储格式,并通过特殊的方式将浮点数映射到整数上,然后再映射回去,这是非常麻烦的事情,因此,它的使用同样也不多。而且,最重要的是,这样算法也需要较多的存储空间。

9 总结

下面是一个总的表格,大致总结了我们常见的所有的排序算法的特点。
排序法  平均时间 最差情形 稳定度 额外空间 备注
冒泡  O(n2)   O(n2)  稳定 O(1) n小时较好
交换   O(n2)   O(n2) 不稳定 O(1) n小时较好
选择  O(n2)  O(n2) 不稳定 O(1) n小时较好
插入  O(n2)  O(n2) 稳定 O(1) 大部分已排序时较好
基数 O(logRB) O(logRB) 稳定 O(n)

 

B是真数(0-9),

R是基数(个十百)

Shell O(nlogn) O(ns) 1<2 不稳定 O(1) s是所选分组
快速 O(nlogn) O(n2) 不稳定 O(nlogn) n大时较好
归并 O(nlogn) O(nlogn) 稳定 O(1) n大时较好
O(nlogn) O(nlogn) 不稳定 O(1) n大时较好

posted @ 2010-08-23 19:29 eircQ 阅读(171) | 评论 (0)编辑 收藏

;***************************************************************************************************************
;       strlen returns the length of a null-terminated string in bytes, not including the null byte itself.
;       Algorithm:
;       int strlen (const char * str)
;       {
;           int length = 0;
;
;           while( *str++ )
;                   ++length;
;
;           return( length );
;       }

;***************************************************************************************************************
;       memcpy() copies a source memory buffer to a destination buffer.
;       Overlapping buffers are not treated specially, so propogation may occur.
;       Algorithm:
;       void * memcpy(void * dst, void * src, size_t count)
;       {
;               void * ret = dst;
;               /*
;                * copy from lower addresses to higher addresses
;                */
;               while (count--)
;                       *dst++ = *src++;
;
;               return(ret);
;       }

;***************************************************************************************************************
;       memmove() copies a source memory buffer to a destination memory buffer.
;       This routine recognize overlapping buffers to avoid propogation.
;       For cases where propogation is not a problem, memcpy() can be used.
;       Algorithm:
;       void * memmove(void * dst, void * src, size_t count)
;       {
;               void * ret = dst;
;               if (dst <= src || dst >= (src + count)) {
;                       /*
;                        * Non-Overlapping Buffers
;                        * copy from lower addresses to higher addresses
;                        */
;                       while (count--)
;                               *dst++ = *src++;
;                       }
;               else {
;                       /*
;                        * Overlapping Buffers
;                        * copy from higher addresses to lower addresses
;                        */
;                       dst += count - 1;
;                       src += count - 1;
;
;                       while (count--)
;                               *dst-- = *src--;
;                       }
;
;               return(ret);
;       }

;***************************************************************************************************************
int strcmp(const char *str1,const char *str2)
{
while((*str1==*str2)&&(*str1))
{
str1++;
str2++;
}
if((*str1==*str2)&&(!*str1)) //Same strings
return 0;
else if((*str1)&&(!*str2))  //Same but str1 longer
return -1;
else if((*str2)&&(!*str1)) //Same but str2 longer
return 1;
else
return((*str1>*str2)?-1:1);
}

;***************************************************************************************************************
char *strstr1(const char *str1, const char *str2)
{
     char *cp = (char *)str1;  //type transfer
     char *s1, *s2;
     if(!str2) 
      return (char *)str1;
     while (cp)
     {
      s1 = cp;
      s2 = (char *)str2;
      while( !s1 && !s2 && !(*s1-*s2))
      {
       s1++, s2++;
      }
      if(!s2) 
       return cp;
      else
       cp++;
     }
     return NULL;
}

;***************************************************************************************************************
*char *_itoa, *_ltoa, *_ultoa(val, buf, radix) - convert binary int to ASCII string
static void __cdecl xtoa (unsigned long val, char *buf, unsigned radix, int is_neg )
{
        char *p;                /* pointer to traverse string */
        char *firstdig;         /* pointer to first digit */
        char temp;              /* temp char */
        unsigned digval;        /* value of digit */

        p = buf;

        if (is_neg) {
            /* negative, so output '-' and negate */
            *p++ = '-';
            val = (unsigned long)(-(long)val);
        }

        firstdig = p;           /* save pointer to first digit */

        do {
            digval = (unsigned) (val % radix);
            val /= radix;       /* get next digit */

            /* convert to ascii and store */
            if (digval > 9)
                *p++ = (char) (digval - 10 + 'a');  /* a letter */
            else
                *p++ = (char) (digval + '0');       /* a digit */
        } while (val > 0);

        /* We now have the digit of the number in the buffer, but in reverse
           order.  Thus we reverse them now. */

        *p-- = '\0';            /* terminate string; p points to last digit */

        do {
            temp = *p;
            *p = *firstdig;
            *firstdig = temp;   /* swap *p and *firstdig */
            --p;
            ++firstdig;         /* advance to next two digits */
        } while (firstdig < p); /* repeat until halfway */
}
char * __cdecl _itoa ( int val, char *buf, int radix )
{
        if (radix == 10 && val < 0)
            xtoa((unsigned long)val, buf, radix, 1);
        else
            xtoa((unsigned long)(unsigned int)val, buf, radix, 0);
        return buf;
}
char * __cdecl _ltoa ( long val, char *buf, int radix )
{
        xtoa((unsigned long)val, buf, radix, (radix == 10 && val < 0));
        return buf;
}

;***************************************************************************************************************
*long atol(char *nptr) - Convert string to long. Overflow is not detected.
long __cdecl _tstol(const _TCHAR *nptr )
{
        int c;              /* current char */
        long total;         /* current total */
        int sign;           /* if '-', then negative, otherwise positive */
        while ( _istspace((int)(_TUCHAR)*nptr) )
                 ++nptr;   /* skip whitespace */

        c = (int)(_TUCHAR)*nptr++;
        sign = c;           /* save sign indication */
        if (c == _T('-') || c == _T('+'))
            c = (int)(_TUCHAR)*nptr++;    /* skip sign */

        total = 0;

        while ( (c = _tchartodigit(c)) != -1 ) {
            total = 10 * total + c;     /* accumulate digit */
            c = (_TUCHAR)*nptr++;    /* get next char */
        }

        if (sign == '-')
            return -total;
        else
            return total;   /* return result, negated if necessary */
}
int __cdecl _tstoi( const _TCHAR *nptr )
{
        return (int)_tstol(nptr);
}

;***************************************************************************************************************
;performs a byteswap on an unsigned integer.
unsigned short __cdecl _byteswap_ushort(unsigned short i)
{
    unsigned short j;
    j =  (i << 8) ;
    j += (i >> 8) ;
    return j;
}
unsigned long __cdecl _byteswap_ulong(unsigned long i)
{
    unsigned int j;
    j =  (i << 24);
    j += (i <<  8) & 0x00FF0000;
    j += (i >>  8) & 0x0000FF00;
    j += (i >> 24);
    return j;
}

;***************************************************************************************************************
*char *bsearch() - do a binary search on an array
*Entry:
*       const char *key    - key to search for const char *base   - base of sorted array to search unsigned int num   - number of *elements in array unsigned int width - number of bytes per element int (*compare)()   - pointer to function that compares two
*array elements, returning neg when #1 < #2, pos when #1 > #2, and 0 when they are equal. Function is passed pointers to two
*array elements.
*Exit:
*       if key is found: returns pointer to occurrence of key in array
*       if key is not found:returns NULL

void * __cdecl bsearch ( REG4 const void *key, const void *base, size_t num, size_t width, int (__cdecl *compare)(const void *, const void *)   )
{
        REG1 char *lo = (char *)base;
        REG2 char *hi = (char *)base + (num - 1) * width;
        REG3 char *mid;
        size_t half;
        int result;

        while (lo <= hi)
                if (half = num / 2)
                {
                        mid = lo + (num & 1 ? half : (half - 1)) * width;
                        if (!(result = (*compare)(key,mid)))
                                return(mid);
                        else if (result < 0)
                        {
                                hi = mid - width;
                                num = num & 1 ? half : half-1;
                        }
                        else    {
                                lo = mid + width;
                                num = half;
                        }
                }
                else if (num)
                        return((*compare)(key,lo) ? NULL : lo);
                else
                        break;

        return(NULL);
}

;***************************************************************************************************************
void __cdecl _tmakepath (register _TSCHAR *path, const _TSCHAR *drive, const _TSCHAR *dir,
const _TSCHAR *fname, const _TSCHAR *ext  )
{
     register const _TSCHAR *p;
     /* copy drive */
     if (drive && *drive) {
                *path++ = *drive;
                *path++ = _T(':');
        }

        /* copy dir */
        if ((p = dir) && *p) {
                do {
                        *path++ = *p++;
                }while (*p);
                if (*(p-1) != _T('/') && *(p-1) != _T('\\')) {
                        *path++ = _T('\\');
                }
        }

        /* copy fname */
        if (p = fname) {
                while (*p) {
                        *path++ = *p++;
                }
        }

        /* copy ext, including 0-terminator - check to see if a '.' needs to be inserted. */
        if (p = ext) {
                if (*p && *p != _T('.')) {
                        *path++ = _T('.');
                }
                while (*path++ = *p++)
                        ;
        }
        else {
                /* better add the 0-terminator */
                *path = _T('\0');
        }
}


posted @ 2010-08-23 14:42 eircQ 阅读(372) | 评论 (0)编辑 收藏

人生的一张时间表

如果每天都有86400元进入您的银行户头,而且必须当天用完,您会如何运用这笔钱?天下真有这样的好事吗?是的,您真的有这样一个户头,那就是“时间”。每天每一个人都会有新的86400秒进帐。看起来很富有?假如一个人的寿命为60岁,那么一生时间中,睡觉要花掉20年,吃饭6年,穿衣和梳洗5年,生病3年,打电话1年,照镜子70天(部分女性除外),抹鼻涕10天,剩下的工作时间是多少呢?您又是怎样利用它们呢?

哲学家伏尔泰说:最长的莫过于时间,因为它无穷无尽;最短的也莫过于时间,因为我们所有的计划都来不及完成。您是否有过这样的经历:某一天,您雄心勃勃地准备把手底下的事清理干净,可到头来却一事无成?也许每个人都曾有过这样的经历,但在某些人身上表现得格外明显。

让我们分析一下时间是如何被浪费掉的。

人生时间表

假如一个人的寿命为60岁,那么他总共只有21900天。一生时间的用途分别为:

  • 睡20年(7300天);
  • 吃饭6年(2190天);
  • 穿衣和梳洗5年(1825天);
  • 生病3年(1095天);
  • 打电话1年(365天);
  • 照镜子70天;
  • 抹鼻涕10天。

最后只剩下3205天,即8年又285天,用来做有用的工作。(人生真的很苦短)

如何找到时间浪费的原因

在8年又285天的时间里,我们又做了哪些浪费时间的事情?不妨问问自己以下四个问题:

  • 我做了什么根本不需要做的事?
  • 我做了什么能够由别人,并且应该由别人做的事?
  • 我做了什么耗时过长的事?
  • 我做了什么会浪费别人时间的事?

也许您很少或者没有做过以上那些事情,但问题有时并不在事情本身,看看自己是否也有这些浪费时间的习惯:

  • 做事目标不明确。
  • 作风拖拉。
  • 缺乏扰先顺序,抓不住重点。
  • 过于注重细节。
  • 做事有头无尾。
  • 没有条理,不简洁,简单的事情复杂化。
  • 事必躬亲,不懂得授权。
  • 不会拒绝别人的请求。
  • 消极思考。

人人都需要时间管理

一项国际查表明:一个效率糟糕的人与一个高效的人工作效率相差可达10倍以上。

时间管理可以帮助您把每一天、每一周甚至每个月的时间进行有效的合理安排。运用这些时间管理技巧帮您统筹时间,对于每个人来说都是非常重要的。

在时间管理中,“计划组织”相对于其他技巧来说是最简单的一种。比如,所有的时间管理建议都包括在一些表格当中,在表格中把您想要完成的任务填进去。对很多人来说,这是最简单和普通的了。当然,制表格和填表对一些人来说是有困难的。这是一个天份问题,与一个人的逻辑能力、空间想象力、创造力和抽象思维能力无关。时间管理是需要经过训练的,如果您没有准备好接受专门训练的话,您将不能成为一个优秀的时间管理者。《牛津管理评论》上推荐的十大自我时间管理技巧,值得注意的是,没有称之为最好的方法,不过这些方法对作者本人是有帮助的,希望对您也能有所帮助。

  1. 每天清晨把一天要做的事都列出清单

    如果您不是按照办事顺序去做事情的话,那么您的时间管理也不会是有效率的。在每一天的早上或是前一天晚上,把一天要做的事情列一个清单出来。这个清单包括公务和私事两类内容,把它们记录在纸上、工作簿上、您的PDA或是其他什么上面。在一天的工作过程中,要经常地进行查阅。举个例子,在开会前十分钟的时候,看一眼您的事情记录,如果还有一封电子邮件要发的话,您完全可以利用这段空隙把这项任务完成。当您做完记录上面所有事的时候,最好要再检查一遍。如果您和我有同样的感觉,那么,在完成工作后通过检查每一个项目,您体会到一种满足感。

  2. 把接下来要完成的工作也同样记录在您的清单上

    在完成了开始计划的工作后,把下来要做的事情记录在您的每日清单上面。如果您的清单上在内容已经满了,或是某项工作可以转过天来做,那么您可以把它算作明天或后天的工作计划。您是否想知道为什么有些人告诉您他们打算做一些事情但是没有完成的原因吗?这是因为他们没有把这些事情记录下来。如果我是一个管理者,我不会三翻五次地告诉我的员工我们都需要做哪些事情。我从不相信他们的记忆力。如果他们没带纸和笔,我会借给他们,让他们要完成的工作和时间期限记录下来。

  3. 对当天没有完成的工作进行重新安排

    现在您有了一个每日的工作计划,而且也加进了当天要完成的新的工作任务。那么,对一天下来那些没完成的工作项目又将做处置呢?您可以选择将它们顺延至第二天,添加到您明天的工作安排清单中来。但是,希望您不要成为一个办事拖拉的人,每天总会有干不完的事情,这样,每天的任务清单都会比前一天有所膨胀。如果的确事情重要,没问题,转天做完它。如果没有那么重要,您可以和与这件事有关的人讲清楚您没完成的原因。

  4. 记住应赴的约会

    使用您的记事清单来帮您记住应赴的约会,这包括与同事和朋友的约会。以我的经验看,工作忙碌的人们失约的次数比准时赴约的次数还多。如果您不能清楚地记得每件事都做了没有,那么一定要把它记下来,并借助时间管理方法保证它的按时完成。如果您的确因为有事而不能赴约,可以提前打电话通知您的约会对象。

  5. 制一个表格,把本月和下月需要优先做的事情记录下来

    据我所知很多人都开始制定每一天的工作计划。那么有多少人会把他们本月和下月需要做的事情进行一个更高水平的筹划呢?除非您从事的是一项交易工作,它的时间表上总是近期任务,您经常是在每个月末进行总结,而月初又开始重新安排筹划。对一个月的工作进行列表规划是时间管理中更高水平的方法,再次强调,您所列入这个表格的一定是您必须完成不可的工作。在每个月开始的时候,将上个月没有完成而这个月必须完成的工作添加入表。

  6. 把未来某一时间要完成的工作记录下来

    您的记事清单不可能帮助提醒您去完成在未来某一时间要完成的工作。比如,您告诉您的同事,在两个月内您将和他一起去完成某项工作。这时您就需要有一个办法记住这件事,并在未来的某个时间提醒您。我一般是用一个电子日历,因为很多电子日历都有提醒功能。其实为了保险起见,您可以使用多个提醒方法,一旦一个没起作用,另一个还会提醒您。

  7. 保持桌面整洁

    我从不相信一个把自已工作环境弄得乱糟糟人会是一个优秀的时间管理者。同样的道理,一个人的卧室或是办公室一片狼藉,他也不会是一个优秀的时间管理者。因为一个好的时间管理者是不会花很长时间在一堆乱文件中找出所需的材料的。

  8. 把做每件事所需要的文件材料放在一个固定的地方

    随着时间的过去,您可能会完成很多工作任务,这就要注意保持每件事的有序和完整。我一般会把与某一件事有关的所有东西放在一起,这样当我需要时查找起来非常方便。当我彻底完成了一项工作时,我会把这些东西集体转移到另一个地方。

  9. 清理您用不着的文件材料

    也许您会感到吃惊,在过去的十年中,我只有一个装文件的抽屉,那里有我这些年所有的工作文件。我总是把新用完的工作文件放在抽屉的最前端,当抽屉被装满的时候,我会清除在抽屉最后面的文件。换句话说,我总是保持有一个抽屉的文件,总量不会超出这个范围。有的人会把所有的文件都保留着,这些没完没了的文件材料最后会成为无人问津的废纸,很多文件可能都不会再被人用到。我在这里所提到的文件材料并不包括您的工作手册或是必需的参考资料,而是那些用作积累的文件。当然,有的时候,我也会去查找用过的文件,它们虽然经过了我的清理,但原稿我会一直保留在计算机里。

  10. 定期备份并清理计算机

    我对保存在计算机里的文件的处理方法也和上面所说的差不多。我猜想,您保存在计算机里的95%的文件打印稿可能还会在您的手里放三个月。我定期地备份文件到光盘上,并马上删除机器中不再需要的文件。


posted @ 2010-08-23 13:51 eircQ 阅读(108) | 评论 (0)编辑 收藏

为什么要用存储过程 

 

 

几个去 IBM 面试的兄弟回来抱怨:去了好几个不同的 IBM 项目组,几乎每个面试官问到数据库的时候都要问用没用过存储过程,烦人不?大家去面的程序员,又不是 DBA,以前的项目都没有用到存储,不照样运行的好好的?

存储过程真的那么重要吗,它到底有什么好处呢?

笔者认为,存储过程说白了就是一堆 SQL 的合并。中间加了点逻辑控制。

但是存储过程处理比较复杂的业务时比较实用。
比如说,一个复杂的数据操作。如果你在前台 处理的话。可能会涉及到多次数据库连接。但如果你用存储过程的话。就只有一次。从响应时间上来说有优势。
也就是说存储过程可以给我们带来运行效率 提高的好处。
另外,程序容易出现 BUG 不稳定,而存储过程,只要数据库不出现问题,基本上是不会出现什么问题的。也就是说从安全上讲,使用了存储过程的系统更加稳定。

数据量小的,或者和钱没关系的项目不用存储过程也可以正常运作。mysql 的存储过程还有待实际测试。如果是正式项目,建议你用 sql server 或 oracle 的存储过程。数据与数据之间打交道的话,过程会比程序来的快的多。面试官问有没有用存储,实际上就是想知道前来面试的程序员到底做过数据量大的项目没。如 果是培训出来的,或者小项目小公司出来的,对存储肯定接触的少了。

所以,要想进大公司,没有丰富存储过程经验,是不行的。

那么什么时候才可以用存储?对于数据量不是很大以及业务处理不是很复杂的小项目就无需要了么?
错。 存储过程不仅仅适用于大型项目,对于中小型项目,使用存储过程也是非常有必要的。其威力和优势主要体现在:
  1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
  2.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQL 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。
  3.存储过程可以重复使用,可减少数据库开发人员的工作量。
  4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。
posted @ 2010-08-20 15:36 eircQ 阅读(259) | 评论 (0)编辑 收藏

   1. /***********************************/  
   2. /* 功能:求两个单链表是否相交和交点*/  
   3. /* 转载自CSDN博客                  * /  
   4. /* 日期:2010/03/29                */  
   5. /***********************************/  
   6.   
   7.   
   8. Node* find(Node* head1,Node* head2)     
   9. {     
  10.      Node *p1=head1,*p2=head2;     
  11.     int m=0,n=0;     
  12.     while(p1)//O(len1)     
  13.      {
  14.          p1=p1->next;     
  15.          m++;
  16.      }
  17.     while(p2)//O(len2)
  18.      {
  19.          p2=p2->next;     
  20.          n++;     
  21.      }
  22.      p1=head1;
  23.      p2=head2;
  24.           
  25.     if(m>n)
  26.      {     
  27.         for(i=0;i<m-n;i++)     
  28.              p1=p1->next;     
  29.      }
  30.     else
  31.      {
  32.         for(i=0;i<n-m;i++)
  33.                p2=p2->next;
  34.      }//O(abs(len1-len2))
  35.     while(p1!=p2)
  36.      {
  37.          p1=p1->next;
  38.          p2=p2->next;     
  39.      }//O(min(len1,len2))     
  40.     return p1;
  41. }
posted @ 2010-08-18 11:26 eircQ 阅读(236) | 评论 (0)编辑 收藏

==========================
 功能:选择排序(由小到大)
 返回:指向链表表头的指针
==========================
*/

/*
 选择排序的基本思想就是反复从还未排好序的那些节点中,
 选出键值(就是用它排序的字段,我们取学号num为键值)最小的节 点,
 依次重新组合成一个链表。

 我认为写链表这类程序,关键是理解:
 head存储的是第一个节点的地址,head->next存储的是第二个节点的地址;
 任 意一个节点p的地址,只能通过它前一个节点的next来求得。

单向链表的选择排序图示:
---->[1]---->[3]---->[2]...----> [n]---->[NULL](原链表)
head   1->next  3->next  2->next   n->next

---->[NULL](空链表)
first
tail

---->[1]---->[2]---->[3]...---->[n]---->[NULL](排序后链表)
first   1->next  2->next  3->next   tail->next

图10:有N个节点的链表选择排序

1、先在原链表中找最小的,找到一个后就把它放到另一个空的链表中;
2、空链表中安放第一个进来的节点,产生一个有序链表,并且让它在原链 表中分离出来(此时要注意原链表中出来的是第一个节点还是中间其它节点);
3、继续在原链表中找下一个最小的,找到后把它放入有序链表的尾指针的 next,然后它变成其尾指针;
*/
struct student *SelectSort(struct student *head)
{
 struct student *first; /*排列后有序链的表头指针*/
 struct student *tail; /*排列后有序链的表尾指针*/
 struct student *p_min; /*保留键值更小的节点的前驱节点的指针*/
 struct student *min; /*存储最小节点*/
 struct student *p; /*当前比较的节点*/
 
 first = NULL;
 while (head != NULL) /*在链表中找键值最小的节点。*/
 {
  /*注意:这里for语句就是体现选择排序思想的地方*/
  for (p=head,min=head; p->next!=NULL; p=p->next) /*循环遍历链表中的节点,找出此时最小的节点。*/
  {  
   if (p->next->num < min->num) /*找到一个比当前min小的节点。*/
   {
    p_min = p; /*保存找到节点的前驱节点:显然p->next的前驱节点是p。*/
    min = p->next; /*保存键值更小的节点。*/
   }
  }
 
  /*上面for语句结束后,就要做两件事;一是把它放入有序链表中;二是根据相应的条件判断,安排它离开原来的链表。*/
 
  /*第一件事*/
  if (first == NULL) /*如果有序链表目前还是一个空链表*/
  {
   first = min; /*第一次找到键值最小的节点。*/
   tail = min; /*注意:尾指针让它指向最后的一个节点。*/
  }
  else /*有序链表中已经有节点*/
  {
   tail->next = min; /*把刚找到的最小节点放到最后,即让尾指针的next指向它。*/
   tail = min; /*尾指针也要指向它。*/
  } 

  /*第二件事*/
  if (min == head) /*如果找到的最小节点就是第一个节点*/
  {
   head = head->next; /*显然让head指向原head->next,即第二个节点,就OK*/
  }
  else /*如果不是第一个节点*/
  {
   p_min->next = min->next; /*前次最小节点的next指向当前min的next,这样就让min离开了原链表。*/
  } 
 }

 if (first != NULL) /*循环结束得到有序链表first*/
 {
  tail->next = NULL; /*单向链表的最后一个节点的next应该指向NULL*/
 }
 head = first;
 return head;
}


/*
==========================
 功能:直接插入排序(由小到大)
 返回:指向链表表 头的指针
==========================
*/

/*
 直接插入排序的基本思想就是假设链表的前面n-1个节点是已经按键值
 (就是用它排序的字段,我们取学号num为键值)排好 序的,对于节点n在
 这个序列中找插入位置,使得n插入后新序列仍然有序。按照这种思想,依次
 对链表从头到尾执行一遍,就可以使无序链 表变为有序链表。
 
单向链表的直接插入排序图示:
---->[1]---->[3]----> [2]...---->[n]---->[NULL](原链表)
head   1->next  3->next  2->next   n->next

---->[1]---->[NULL](从原链表中取第1个节点作为只有一个节点的有序链表)
head
图11

---->[3]---->[2]...---->[n]---->[NULL](原链表剩下用于直接插入排序的节点)
first   3->next  2->next   n->next
图12

---->[1]---->[2]---->[3]...---->[n]---->[NULL](排序后链表)
head   1->next  2->next  3->next   n->next

图13:有N个节点的链表直接插入排序

1、先在原链表中以第一个节点为一个有序链表,其余节点为待定节点。
2、从图12链表中取节点,到图11链表中定位插入。
3、上面 图示虽说画了两条链表,其实只有一条链表。在排序中,实质只增加了一个用于指向剩下需要排序节点的头指针first罢了。
   这一点请读者务必搞清楚,要不然就可能认为它和上面的选择排序法一样了。
*/
struct student *InsertSort(struct student *head)
{
 struct student *first; /*为原链表剩下用于直接插入排序的节点头指针*/
 struct student *t; /*临时指针变量:插入节点*/
 struct student *p; /*临时指针变量*/
 struct student *q; /*临时指针变量*/
 
 first = head->next; /*原链表剩下用于直接插入排序的节点链表:可根据图12来理解。*/
 head->next = NULL; /*只含有一个节点的链表的有序链表:可根据图11来理解。*/

 while (first != NULL) /*遍历剩下无序的链表*/
 {
  /*注意:这里for语句就是体现直接插入排序思想的地方*/
  for (t=first, q=head; ((q!=NULL) && (q->num < t->num)); p=q, q=q->next); /*无序节点在有序链表中找插入的位置*/
 
  /*退出for循环,就是找到了插入的位置*/
  /*注意:按道理来说,这句话可以放到下面注释了的那个位置也应该对的,但是就是不能。原因:你若理解了上面的第3条,就知道了。*/
  first = first->next; /*无序链表中的节点离开,以便它插入到有序链表中。*/
 
  if (q == head) /*插在第一个节点之前*/
  {
   head = t;   
  }
  else /*p是q的前驱*/
  {
   p->next = t;  
  }
  t->next = q; /*完成插入动作*/
  /*first = first->next;*/
 }
 return head;
}


/*
==========================
 功能:冒泡排序(由小到大)
 返回:指向链表表头的 指针
==========================
*/

/*
 直接插入排序的基本思想就是对当前还未排好序的范围内的全部节点,
 自上而下对相邻的两个节点依次进行比较和调整,让键值 (就是用它排
 序的字段,我们取学号num为键值)较大的节点往下沉,键值较小的往
 上冒。即:每当两相邻的节点比较后发现它们的排序与 排序要求相反时,
 就将它们互换。


单向链表的冒泡排序图示:
---->[1]---->[3]---->[2]...----> [n]---->[NULL](原链表)
head   1->next  3->next  2->next   n->next 

---->[1]---->[2]---->[3]...---->[n]---->[NULL](排序后链表)
head   1->next  2->next  3->next   n->next

图14:有N个节点的链表冒泡排序

任意两个相邻节点p、q位置互换图示:
假设p1->next指向p,那么显然p1->next->next就指向q,
p1->next->next->next 就指向q的后继节点,我们用p2保存
p1->next->next指针。即:p2=p1->next->next,则 有:
[  ]---->[p]---------->[q]---->[  ](排序前)
  p1->next  p1->next->next  p2->next
图15

[  ]---->[q]---------->[p]---->[  ](排序后)

图16

1、排序后q节点指向p节点,在调整指向之前,我们要保存原p的指向节点地址,即:p2=p1->next->next;
2、 顺着这一步一步往下推,排序后图16中p1->next->next要指的是p2->next,所以 p1->next->next=p2->next;
3、在图15中p2->next原是q发出来的指向,排序后图16中 q的指向要变为指向p的,而原来p1->next是指向p的,所以p2->next=p1->next;
4、在图15中 p1->next原是指向p的,排序后图16中p1->next要指向q,原来p1->next->next(即p2)是指向q 的,所以p1->next=p2;
5、至此,我们完成了相邻两节点的顺序交换。
6、下面的程序描述改进了一点就是记录了每次最后一 次节点下沉的位置,这样我们不必每次都从头到尾的扫描,只需要扫描到记录点为止。
   因为后面的都已经是排好序的了。
*/
struct student *BubbleSort(struct student *head)
{
 struct student *endpt; /*控制循环比较*/
 struct student *p; /*临时指针变量*/
 struct student *p1;
 struct student *p2;

 p1 = (struct student *)malloc(LEN);
 p1->next = head; /*注意理解:我们增加一个节点,放在第一个节点的前面,主要是为了便于比较。因为第一个节点没有前驱,我们不能交换地址。*/
 head = p1; /*让head指向p1节点,排序完成后,我们再把p1节点释放掉*/

 for (endpt=NULL; endpt!=head; endpt=p) /*结合第6点理解*/
 {
  for (p=p1=head; p1->next->next!=endpt; p1=p1->next)
  {
   if (p1->next->num > p1->next->next->num) /*如果前面的节点键值比后面节点的键值大,则交换*/
   {
    p2 = p1->next->next; /*结合第1点理解*/
    p1->next->next = p2->next; /*结合第2点理解*/
    p2->next = p1->next; /*结合第3点理解*/
    p1->next = p2; /*结合第4点理解*/
    p = p1->next->next; /*结合第6点理解*/
   }
  }
 }

 p1 = head; /*把p1的信息去掉*/
 head = head->next; /*让head指向排序后的第一个节点*/
 free(p1); /*释放p1*/
 p1 = NULL; /*p1置为NULL,保证不产生“野指针”,即地址不确定的指针变量*/

 return head;
}


/*
==========================
 功能:插入有序链表的某个节点的后面(从小到大)
 返 回:指向链表表头的指针
==========================
*/

/*
有序链表插入节点示意图:

---->[NULL](空有序链表)
head

图18:空有序链表(空有序链表好解决,直接让head指向它就是了。)

以下讨论不为空的有序链表。
---->[1]---->[2]---->[3]...----> [n]---->[NULL](有序链表)
head   1->next  2->next  3->next   n->next

图18:有N个节点的有序链表

插入node节点的位置有两种情况:一是第一个节点前,二是其它节点前或后。

---->[node]---->[1]---->[2]---->[3]...---->[n]---->[NULL]
head  node->next  1->next  2->next  3->next   n->next

图19:node节点插在第一个节点前

---->[1]---->[2]---->[3]...---->[node]...---->[n]---->[NULL]
head   1->next  2->next  3->next    node->next  n->next

图20:node节点插在其它节点后
*/
struct student *SortInsert(struct student *head, struct student *node)
{
 struct student *p; /*p保存当前需要检查的节点的地址*/
 struct student *t; /*临时指针变量*/

 if (head == NULL) /*处理空的有序链表*/
 {
  head = node;
  node->next = NULL;
  n += 1; /*插入完毕,节点总数加1*/
  return head;
 }

 p = head; /*有序链表不为空*/
 while (p->num < node->num && p != NULL) /*p指向的节点的学号比插入节点的学号小,并且它不等于NULL*/
 {
  t = p; /*保存当前节点的前驱,以便后面判断后处理*/
  p = p->next; /*后移一个节点*/
 }
 
 
 if (p == head)  /*刚好插入第一个节点之前*/
 {
  node->next = p;
  head = node;    
 }
 else /*插入其它节点之后*/
 { 
  t->next = node; /*把node节点加进去*/
  node->next = p; 
 }
 n += 1; /*插入完毕,节点总数加1*/
 
 return head;
}

/*

测试代码如下:

*/

/*测试SelectSort():请编译时去掉注释块*/

 /*
 head = SelectSort(head);
 Print(head);
 */
 
 /*测 试InsertSort():请编译时去掉注释块*/

 /*
 head = InsertSort(head);
 Print(head);
 */

 /*测试BubbleSort():请编译时去掉注释块*/

 /*
 head = BubbleSort(head);
 Print(head);
 */

 /*测试SortInsert():上面创建链表,输入节点时请注意学号num从小到大的顺序。请编译时去掉注释块*/

 /*
 stu = (struct student *)malloc(LEN);
 printf("\nPlease input insert node -- num,score: ");
 scanf("%ld,%f",&stu->num,&stu->score);
 head = SortInsert(head,stu);
 free(stu);
 stu = NULL;
 Print(head);
 */


posted @ 2010-08-12 16:29 eircQ 阅读(1831) | 评论 (2)编辑 收藏

1、不说"不可能";
2、凡事第一反应: 找方法,不找借口;
3、遇到挫折对自己说声:太好了,机会来了;
4、不说消极的话,不落入消极的情绪,一旦发生立即正面处理;
5、凡事先订立目标;
6、行动前,预先做计划;
7、工作时间,每一 分、每一秒做有利于生产的事情;
8、随时用零碎的时间做零碎的 事情;
9、守时;
10、写点日记,不要太依*记忆;
11、随时记录想到的灵感;
12、把重要的观念、方法写下来,随时提示自己;
13、走路比平时快30%,肢体语言健康有力,不懒散、萎靡;
14、每天出门照镜子,给自己一个自信的微笑;
15、 每天自我反省一次;
16、每天坚持一次运动;
17、听心跳一分钟,在做重要的事情,疲劳时,紧张时,烦躁时。。。。
18、开会做前排;
19、微笑;
20、用心倾听,不打断对方的 话;
21、说话有力,感觉自己的声音能产生感染力的磁场;
22、说话之前,先考虑一下对方的感觉;
23、每天有意识赞美别人三次以上;
24、即使表示感谢,如果别人帮助了你的话;
25、控制住不要让自己作出为自己辩护的第一反应;
26、不用训斥、指责的口吻与别人说话;
27、每天做一件"分外事";
28、不关任何方面,每天必须至少做一次"进步一点点",并且有意识的提高;
29、每天提前15分上班,推迟30分下班;
30、每天下班前5分钟做一下今天的整理工作;
31、定期存钱;
32、节俭;
33、时常运用"头脑风暴", 利用脑力激荡提升自己创新能力;
34、恪守诚信;
35、学会原谅。


posted @ 2010-08-12 14:00 eircQ 阅读(180) | 评论 (0)编辑 收藏

仅列出标题
共4页: 1 2 3 4