石头肉丸子
关于编程,大学没有传授的十件事
展开Biu

笔者依然记得当年完成学业时,深信自己已经准备好进入任何一家软件公司,并开始成为一个顶级的开发人员。显然,开始工作后没多久,笔者就意识到,还有很多事是我所不了解的。在不断吸取经验的同时,笔者一直在努力学习那些我从来没有学过的,但却是成为优秀的开发人员所应了解的基本知识。以下是笔者希望自己能在学校就学到的十件事。

1. 我们总是错的

开发人员有着相当大的自我意识,包含了一些其他的非技术性缺陷,这也正是为什么我们很难发现我们做错了什么。我看到过很多无休止的设计讨论,开发人员不断地发表自己的想法……呵呵!猜猜怎样……我们都错了,唯一的区别就是我们犯错的离谱程度不同。

理解并接受这个事实非常重要,我们只有这样做了,才能敞开心胸去听听别人的意见,采用他们的想法,来得出一个更好的解决办法。

2. 事情若有可能出错,就一定会出错

也就是说“希望驱动开发(hope driven development)”,如果你对于某些事并不确定,如果你发现自己使用了“应该”这个词,那你就麻烦了。

而这只有一个解决方案,尽己所能去保证它不会出错,这可能意味着你需要编写一个测试、调试并验证需求……

3. 所有的代码都烂

在我抱怨那些我碰到过的代码十年之久后,我得出了一个精辟的结论,所有的(包括我自己写的)代码,都烂。当然,烂还是有等级之分的,但即便是我见过写得最好的代码,也是难以读懂的。

这并不意味着把你的代码写得更好是没有意义的,恰恰相反,最好和最坏的代码还是有天壤之别的。

4. 错误(Bug)总会存在

永远存在!问题只在于要发现它困难与否。

5. 客户最大

许多客户并不在乎你在方案中使用了哪些技术,应用程序需不需要做更多的事……或通俗上说,你是否使用了好的实践方案。

也因为我可以想象,要是我只说了前面那一段,我会收到多少恶评,让我说得更清楚些……我想说的是,我们永远不应该忘记客户的立场,有时候,开发人员为了最佳实践而在项目工程中过度坚持采用(某些)技术,但要记住,若这些技术无法给客户带来价值,那就放弃吧!

6. 纸上谈兵是行不通的

我曾认为,我可以在前期就把我的整个设计置于纸上,然后只要将缺漏处填上就好,但这样根本行不通。

软件开发是复杂的,若不亲手去碰碰看,很难看到所有的实际层面以及它们之间的关系。因此,在前期保持规划与设计是很有用的,但不要过度坚持,也不要把设计图表当作合约固守。

7. 少即是多

或者,你可能知道更好的说法是:“Keep it simple, stupid!”(保持简单,KISS设计原则)。所以,如果没有必要的就舍弃吧!因为要记住:“事情若有可能出错,就一定会出错。”

8. 编写代码只是我们所做工作的20%而已

请准备好,花80%的时间用于思考、调试、测试、开会、谈话……而所有的其他活动都是非常重要的,所以若要成为一个优秀的软件开发人员,你必须培养广泛而全面的技巧(Skill),而不仅仅是技术(Technical)。

9. 客户永远不知道他/她想要的是什么

客户若有需求,或是想法,但是他们不知道详细情况……软件开发要做的工作就是,发现细节并去除所有的不确定性,将这些需求转换成客户想要一个应用程序。

10. 已经有人做过了

所以不要再重新发明轮子,用谷歌找找看,或者更好的方法是,请教你的同事,很多时候他们可能都已经做了相同、或非常类似的事情。

英文原文:10 things they never teach in college about programming

中文翻译:伯乐在线

本文转载自: 伯乐在线

收藏此资讯

[查看全文]
懒之圣帝
关于MariaDB的启动方法
展开Biu

在官网找不到启动脚本的下载地址,又据说在/opt目录下,但是里面什么也没有。

软件源也没有发现图形管理工具。man也似乎没有说明如何启动。

好了,怎么办?

[查看全文]
蛋蛋包子
求助一下關於C++調用構造函數的問題
展开Biu

本帖最后由 蛋蛋包子 于 2013-7-19 05:31 编辑

#km無論怎樣的看不懂啦....要求下面的那些題目調用了哪些構造函數(default,copy,destructor,assignment operator)

求大神能詳細指導一下麼?比如說在哪一句用了哪個構造函數

class A

{

public:

A();

A(const A&);

~A();

void operator = (const A&);

};

A::A(){cout<<"default constructor called\n";}

A::A(const A&){cout<<"copy constructor called\n";}

A::~A(){cout<<"destructor called\n";}

void A::operator=(const A& right_side){cout<<"assighnment operator called\n";}

這個是前面的定義。問題有6個..

第一個

void foo(A& anobj)

{

cout<<"inside foo\n";

}

int main()

{

A thing;

foo(thing);

system("pause");

return 0;

}

用了default,但是求大神講解一下爲什麽只用了default...

第二個

A foo(A anobj)

{

cout<<"inside foo\n";

return anobj;

}

int main()

{

A thing;

foo(thing); //the returned object is destructed

system("pause");

return 0;

}

這個用了default,copy,in side foo:copy,destructor,destructor

前面的一個default是main裏面的A thing這一句call出來的,copy的話是不是A foo(A anobj)這一句結束后call出來的還是說是在foo(thing)這裡?然後那個return的話是不是都要調用一個copy,所以在foo裏面有一個copy,然後題後面說了那個return後面的object會被刪掉,也就是說所以在return一完,就會有一個destru被call,然後整個foo run完,又調用一個destru 刪掉了一開始的一個copy。不知道這樣理解對不對...

第三個

A foo(A anobj)

{

cout<<"inside foo\n";

return anobj;

}

int main()

{

A thing;

A another=foo(thing);

system("pause");

return 0;

}

default,copy,inside foo:copy,destructor

這個爲什麽只有一個destructor?就是說foo(thing)和A another=foo(thing)的各自作用到底是什麽...

第四個

A foo(A& anobj)

{

cout<<"inside foo\n";

return anobj;

}

int main()

{

A thing;

A another=foo(thing);

system("pause");

return 0;

}

default,copy。除了default就完全沒看懂了= =&這個符號在這裡是指的是地址還是說指的是reference..?

第五個

A foo(A anobj)

{

cout<<"inside foo\n";

return anobj;

}

int main()

{

A thing;

A another;

another=foo(thing);

system("pause");

return 0;

}

default,default,copy,inside:destructor,assignment operator,destructor

一開始的兩個default知道,copy的話不是很確定是在哪裡call出來的。assignment operator的話應該是another=foo(thing)這裡被call出來的吧。其他的都不知道是怎麼來的Orz

第六個

A& foo(A& anobj)

{

cout<<"inside foo\n";

return anobj;

}

int main()

{

A thing;

A another;

another=foo(thing);

system("pause");

return 0;

}

default,default,assignment operator

上面的inside foo後面的哪些constructor我不是能肯定到底是不是在foo裏面,答案只供參考= =還求大神指導之

[查看全文]
Ca(OH)2
关于指针和函数的问题,求大神解释
展开Biu

本人最经无聊,在用c语言(vc6.0)高精度计算的程序。然后想把输入也写一个函数,想让主程序看的清楚一点。函数本身问题不是太大,但是我在调用的时候出现了问题。函数传入的参数是一个数组的地址,和输入个数的限制。但是在实际调用时,我在主程序写:

函数名(&数组名,长度);

程序一直在这行上报错。

但是一旦我写成:

函数名((数组名),长度);

就不会有任何问题。~34!

我虽然知道()和&都是取址符,但是这两个的区别又是什么呢?为什吗会报错呢?

这种情况在别的程序也有发生。但是不经常,(好吧,是我程序编的少)。到底是为什么?!!!!!!$63$

[查看全文]
lauyukit
关于Python自己写的模块的问题
展开Biu

本帖最后由 lauyukit 于 2013-7-17 00:29 编辑

自学python一星期了,最近在写一个简单地记录信息的类似于电话簿的程序。

问题简单来说是这样:

我写了一个类Person,并在类中定义了__str__函数,使得我在print Person的对象时能够按照我的需要输出。

然后我在类的下面写了主程序,在里面创建了一个名为Book.data的文件。接着,我创建了一个名为book的

字典(book = {}),再把book['Frost'] = Person('Frost'). 就是把Person的对象与'Frost'对应起来。我把

book保存在了Book.data里。后来我另外写了个小程序去读取Book.data(详细如下)

[mw_shl_code=python,true]#!/usr/bin/python

# Filename: test.py

import person

import cPickle as p

f = file('Book.data', 'w')

book = p.load(f)

print book

f.close()[/mw_shl_code]

本来预期结果是

('Frost' : 'Frost ...(省略)')

但是却报错提示

Traceback (most recent call last):

File "C:\Users\Frost\Desktop\test.py", line 6, in *本站禁止HTML标签噢*

book = p.load(f)

AttributeError: 'module' object has no attribute 'Person'

我知道import Person后,使用Person的函数必须要通过person.function()这种形式去调用

我想知道的是,要怎么解决这问题呢?或许是我本来这样封装类的做法不对,我有C++的基础.....

跪求大大指导!!!!

不知道@南南 和Whisper版主会不会呢.....来救救我..@@9!!

[查看全文]
胖虎
java买什么书能比较深入的学习java
展开Biu

现在往下学才发现对java其实等于几乎没了解,很多错误变成了java的设计语法错误,暑假到了想重新撸撸java,买一本当是工具书(课本不想吐槽了)。然后~~~~~~ 问题来了~~ 什么书比较好咧~~~+12+

[查看全文]
jinlei6394
【闹着玩】C++版Hellow World
展开Biu

本帖最后由 jinlei6394 于 2013-7-7 01:45 编辑

[mw_shl_code=cpp,true]#include *本站禁止HTML标签噢*

class i

{

public:

i()

{

std::cout<<"Hel";

}

~i()

{

std::cout<<"\n";

}

virtual void func()

{

std::cout<<"ld";

}

};

class c : public i

{

public:

~c()

{

func();

std::cout<<"!";

}

c()

{

std::cout<<"low";

delete this;

}

virtual void func()

{

std::cout<<" wor";

i::func();

}

};

int main()

{

new c();

}

[/mw_shl_code]

[查看全文]
ten6box
Σ(っ °Д °;)っ 救命……给我个思路就好QAQ
展开Biu

设计一个递归算法求含n个元素的集合的幂集并输出……(集合s的幂集指由s的所有子集组成的集合)

话说我完全不懂递归和迭代的不同啊喂……

这样大量的输出是用数组比较好_(:з」∠)_?!

完全没救了……脑细胞死绝罒 - 罒!!

救命……

[查看全文]