笔者依然记得当年完成学业时,深信自己已经准备好进入任何一家软件公司,并开始成为一个顶级的开发人员。显然,开始工作后没多久,笔者就意识到,还有很多事是我所不了解的。在不断吸取经验的同时,笔者一直在努力学习那些我从来没有学过的,但却是成为优秀的开发人员所应了解的基本知识。以下是笔者希望自己能在学校就学到的十件事。
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
中文翻译:伯乐在线
本文转载自: 伯乐在线[查看全文]
在官网找不到启动脚本的下载地址,又据说在/opt目录下,但是里面什么也没有。
软件源也没有发现图形管理工具。man也似乎没有说明如何启动。
好了,怎么办?
[查看全文]
本帖最后由 蛋蛋包子 于 2013-7-19 05:31 编辑
#km無論怎樣的看不懂啦....要求下面的那些題目調用了哪些構造函數(default,copy,destructor,assignment operator)
求大神能詳細指導一下麼?比如說在哪一句用了哪個構造函數
這個是前面的定義。問題有6個..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";}
第一個
用了default,但是求大神講解一下爲什麽只用了default...void foo(A& anobj){
cout<<"inside foo\n";
}
int main()
{
A thing;
foo(thing);
system("pause");
return 0;
}
第二個
這個用了default,copy,in side foo:copy,destructor,destructorA 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是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。不知道這樣理解對不對...
第三個
default,copy,inside foo:copy,destructorA foo(A anobj){
cout<<"inside foo\n";
return anobj;
}
int main()
{
A thing;
A another=foo(thing);
system("pause");
return 0;
}
這個爲什麽只有一個destructor?就是說foo(thing)和A another=foo(thing)的各自作用到底是什麽...
第四個
default,copy。除了default就完全沒看懂了= =&這個符號在這裡是指的是地址還是說指的是reference..?A foo(A& anobj){
cout<<"inside foo\n";
return anobj;
}
int main()
{
A thing;
A another=foo(thing);
system("pause");
return 0;
}
第五個
default,default,copy,inside:destructor,assignment operator,destructorA foo(A anobj){
cout<<"inside foo\n";
return anobj;
}
int main()
{
A thing;
A another;
another=foo(thing);
system("pause");
return 0;
}
一開始的兩個default知道,copy的話不是很確定是在哪裡call出來的。assignment operator的話應該是another=foo(thing)這裡被call出來的吧。其他的都不知道是怎麼來的Orz
第六個
default,default,assignment operatorA& foo(A& anobj){
cout<<"inside foo\n";
return anobj;
}
int main()
{
A thing;
A another;
another=foo(thing);
system("pause");
return 0;
}
上面的inside foo後面的哪些constructor我不是能肯定到底是不是在foo裏面,答案只供參考= =還求大神指導之
[查看全文]
本人最经无聊,在用c语言(vc6.0)高精度计算的程序。然后想把输入也写一个函数,想让主程序看的清楚一点。函数本身问题不是太大,但是我在调用的时候出现了问题。函数传入的参数是一个数组的地址,和输入个数的限制。但是在实际调用时,我在主程序写:
函数名(&数组名,长度);
程序一直在这行上报错。
但是一旦我写成:
函数名((数组名),长度);
就不会有任何问题。~34!
我虽然知道()和&都是取址符,但是这两个的区别又是什么呢?为什吗会报错呢?
这种情况在别的程序也有发生。但是不经常,(好吧,是我程序编的少)。到底是为什么?!!!!!!$63$
[查看全文]
本帖最后由 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的设计语法错误,暑假到了想重新撸撸java,买一本当是工具书(课本不想吐槽了)。然后~~~~~~ 问题来了~~ 什么书比较好咧~~~+12+
[查看全文]
本帖最后由 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]
[查看全文]
设计一个递归算法求含n个元素的集合的幂集并输出……(集合s的幂集指由s的所有子集组成的集合)
话说我完全不懂递归和迭代的不同啊喂……
这样大量的输出是用数组比较好_(:з」∠)_?!
完全没救了……脑细胞死绝罒 - 罒!!
救命……
[查看全文]
