我是一名有2年经验的程序员,我在4个地方工作,我真的认为自己是一个自信,流利的开发人员.
我的大多数同事都有CS学位,我觉得没有任何区别!然而,为了跟上这些人的同一个流程,我研究了C(从初学者到专业人员读取C语言),使用C语言的DataStructures,以及使用C++的OOP.
我对指针,内存管理有一个合理的理解,我也参加了一个奖学金,其中C,DataStructures和C++是其中的一部分.
我想要指出,我对C和C++的熟悉程度并不超过阅读某些页面,并执行一些演示; 我没有使用过C或C++的任何项目.
最近我的一个朋友建议我广泛学习C和C++,然后转到OpenGL并学习图形编程.他说,通过学习这些主题我可能获得的见解将在我作为程序员的整个生命中真正帮助我.
PS:我是一名全职开发人员,主要从事使用C#的ASP.NET应用程序.
建议?
为了实际进步:
从实际意义上讲,选择一种适合您想要使用的域的语言.
对于大多数编程空间,没有必要学习C或C++.如果不用这些语言编写一行代码,您就可以成为一名非常称职的程序员.
但是,如果您不熟悉现在所处的确切领域,则可以学习C或C++,以便找到较低级别的编程工作.
帮助您成为更好的程序员:
您可以从学习多种语言中学到很多东西.因此,以这种方式拓宽视野总是好的.
如果你想要更多使用其他语言的经验,并且尚未尝试过,我建议学习一种函数式编程语言,如Scheme,Lisp或Haskell.
首先,拥有学位与了解C++无关.我认识几个从CS毕业但没有写过超过50行C/C++的人.CS不是关于编程(在同一意义上,手术不是关于刀),它肯定不是关于个别语言.CS学位要求你在前往其他地方的途中用几种不同的语言捅鼻子.CS教授基础概念,理解编译器,操作系统,运行代码的硬件,算法和数据结构以及许多其他引人入胜的主题.但它并没有教授编程.CS毕业生的编程经验几乎是偶然的.这是他在飞行中选择的东西,或者是因为个人对编程的兴趣.
其次,让我们明白,在不了解C++的情况下,很有可能拥有成功的编程生涯.事实上,我希望大多数程序员属于这一类.所以你当然不需要学习C++.
这留下了学习C++的两个可能原因:
自我提升
改变职业轨道
#2很简单.如果你想转换到C++是主导语言的领域,那么学习它显然是个好主意.你提到了图形编程作为一个例子,如果你想以此为生,学习C++可能是个好主意.(但是,我不认为这对于"作为程序员在整个过程中有用的见解"并不是一个特别好的建议.还有其它更普遍适用的领域.学习图形编程会教你图形编程,而不是很多其他.)
这留下了#1,这更有趣.只要知道C++,你会成为一名更好的程序员吗?也许,但不像有些人想的那么多.C++可能会教你几个有用的东西,但似乎也有一些迷信:它是低级的并且有指针,所以通过学习C++,你将获得启发.
如果你想了解幕后的内容,那么C或C++肯定会有所帮助,但你可以删除中间人并直接学习编译器.这会给你一个更好的主意.补充说明了一些关于CPU如何工作的基本信息,以及一些关于操作系统的信息,并且你已经比C++更好地学习了所有底层的东西.
但是,我认为有些东西值得从C++中获取,没有特别的顺序:
(其中有几个可能让你对C#感到绝望,尽管采用了许多出色的功能,但仍然遗漏了一些C++程序员看起来非常明显的事情)
偏执狂:擅长C++意味着成为一名语言律师.语言留下了许多未定义或未指定的东西,所以一个优秀的C++程序员是偏执狂."我刚刚编写的代码看起来没问题,而且在运行它时它似乎还可以 - 但是标准是否明确定义?它明天会在计算机上破坏,还是在我使用更新的编译器进行编译时?必须检查标准".在其他语言中这不太必要,但携带它可能仍然是一种健康的体验.有时,编译器没有最后的单词.
RAII:C++开创了一种非常聪明的方式来处理资源管理(包括可怕的内存管理).在堆栈上创建一个对象,该对象在其构造函数中获取有问题的资源(数据库连接,内存块,文件,网络套接字或其他任何东西),并在其析构函数中确保释放此资源.这个简单的机制意味着你几乎不会在顶级代码中编写新的/删除,它总是隐藏在构造函数或析构函数中.并且因为当对象超出范围时保证析构函数执行,即使抛出异常,也可以保证释放资源.没有内存泄漏,没有未关闭的数据库连接.C#并不直接支持这一点,但熟悉该技术有时会让你看到一种在C#中模拟它的方法,在它有用的情况下.(显然内存管理不是问题,但确保快速释放数据库连接可能仍然存在)
通用编程,模板,STL和元编程:C++标准库(或它的一部分,通常称为STL)是一个非常有趣的库设计示例.在某些方面,它是.NET或Java类库之前的光年,尽管LINQ修补了.NET的一些最糟糕的缺点.了解它可能会为您提供有关处理序列或数据集的巧妙方法的一些有用见解.它还具有强大的功能编程风格,总是很好用.它是根据模板实现的,这是C++的另一个显着特征,模板元编程也可能有益于学习.不是因为它可以直接应用于许多其他语言,而是因为它可能会为您提供一些在其他语言中编写更通用代码的想法.
直接映射到硬件:C++不一定是低级语言.但是它的大多数抽象都已经过建模,因此可以实现它们直接映射到常见的硬件功能.这意味着它可能有助于更好地理解托管的.net代码与另一端的CPU之间发生的"魔力".如何实现CLR,堆和堆栈实际上是什么意思,等等.
p/invoke:让我们面对它,有时,.NET不提供你需要的功能.你必须调用一些非托管代码.然后,实际了解您可能使用的语言非常有用.(如果你只需要一个pinvoke调用即可绕过它,你只需要能够在MSDN上读取C函数签名,这样你就知道要传递哪些参数,但有时,最好编写自己的C++包装器,并且相反.
我不知道你是否应该学习C++.有充分的理由说明为什么这样做可能会让你成为一个更好的程序员,但话又说回来,还有很多其他你可以花时间去做的东西也会让你成为一个更好的程序员.这是你的选择.:)
经验是最好的老师.
虽然您可以阅读有关内存管理,数据结构(及其实现),算法等内容的信息,但在您有机会将其付诸实践之前,您将无法获得它.虽然我不知道是否真的有必要使用C或C++来学习这些东西,但我会付出一些努力来实际编写一些管理自己内存并实现一些常见数据结构的代码.我想你会学到一些能帮助你更好地理解代码的东西; 要知道幕后发生了什么事,可以这么说.我还建议阅读计算机组织和操作系统,计算机安全性和布尔逻辑.另一方面,我从来没有真正发现需要进行任何OpenGL编程,尽管我曾经做过一些X Windows的东西.