一家当地大学正在向没有编程经验的一年级大学生(16岁)教授C ++。
作为第一门编程语言,C ++适合吗?
一家当地大学正在向没有编程经验的一年级大学生(16岁)教授C ++。
作为第一门编程语言,C ++适合吗?
Answers:
强调没有。
对于学生来说,对于任何目标,另一种语言或一系列语言都会变得越来越快。例子。
“学生需要理解底层概念。”
“低级”编码不包括从中获取对象new
,将它们反馈回delete
,以及偶尔有一个指针指向不应指向的位置。函数,类和模板不是低级的。RAII,12分的方式使用const
,std::ostream::operator<<
,protected
和 new
是不是低层次的概念。这些东西具有低级的含义,您将跳过它们几个月,或者直到以后的课程再学习C ++语义学。
我建议汇编器具有良好的环境和教学材料,例如MIPS或MMIX。如果您很着急,请绕道教C至少看看汇编器输出。这将使您对C ++的所有底层理解,然后再更快一些。
“学生需要了解面向对象的知识。”
C ++内置的面向对象的方法过于复杂,无法教授OO概念或几乎所有其他高级概念。有关潜在原因的详尽清单,请参见C ++常见问题解答。您要么必须花所有的时间,而对于新程序员来说这将需要非常非常长的时间。否则,您将不得不跳过很多内容,从而使新的程序员陷入困境-实际上,并不是真正了解C ++!
如果您必须教C ++,我建议您首先使用对象(Python,Ruby,Squeak,Common Lisp,Racket)来学习一种更简单的高级语言。除此之外,还可以通过访问功能语言来学习多态作为与OO分离的概念。
“学生需要了解模板和模板元编程。”
没有人真正问过这个问题,但我希望他们会这样。C ++有不错的模板,STL很酷,但是它们不应该成为优先教C ++的优先级。无论如何,先教OCaml或Haskell类型系统,然后对这些概念进行改造可能会更快。
“学生需要学习解决问题的能力。”
是的,您可以使用任何一种语言来获得此信息,如果使用除C ++之外的几乎任何语言都可以得到更多信息,因为可以减少行李负担。同样,请参阅C ++常见问题解答,以获取学生将要学习的所有事情的列表,而不是解决问题的技能。
“以上所有内容,我们只需要使用一种语言即可。” 或“雇主想要”。或“我们需要一种C风格的语言。” 要么...
教一种以上的语言。
通过只教一种语言来节省时间或精力的想法简直是荒谬的。它基于这样的思想,即学习任何一种给定的语言都需要X个月的时间(HINT!HINT!),其中X是一个数字或每种语言一个数字。这几乎与您可以通过跳过所有“需求”和“测试”垃圾来节省时间和金钱的想法完全相同。
至于多种语法,如果让学生疯狂地偏向其他语言,如果他们教他们期望使用每种语言的C语法,则会危及学生的生命。
几乎所有路径都比从C ++开始更快,更好。学习一种简单的高级语言,然后学习C ++会更快。学习汇编程序,然后学习C ++会更快。除了C ++外,其他任何东西都可以使学生更快到达那里,并且他们将知道更多的启动方法。只是不要先教C ++。
不,即使对于有经验的C ++开发人员来说,C ++也是一种困难的语言。即使是最简单的算法,您也必须解释许多语言的细微差别。考虑一个Hello World示例:
#include <iostream>
int main()
{
std::cout << "Hello World!" << std::endl;
}
那是什么#include
命令?什么是std::cout
。为什么::
呢?什么<<
啊 哦,这是个超负荷的操作员!什么是重载运算符?如此ints
,它确实会发生位移,但无论如何std::cout
,它将内容输出到控制台。哦,std::cout
是一个流,并且流的<<
和>>
运算符已重载。
让我们看一下Python中的相同示例:
print("Hello World!")
就是这样,让我们开始编写一些算法。
它可能不是一种好的第一语言:复杂的语法,很多规则,旧语言,易于出错的内存管理。最好教给学生更多类似于OO的东西,例如Smalltalk,或者更好地使用Python编程,或者像Haskell这样的功能。
在学习了更好的语言之后,他们可以在以后的生活中学习C ++(如果他们不能帮助的话)。
简短的回答:是的!
我会说任何一种语言都是合适的开始,但特别是C ++(或同等语言)。如今,C#和Java是使用中的主要语言,通过它们您可以快速学习以依赖API和IDE进行编程,但是使用C ++可以从头开始学习编程,包括性能优化等。
在您盲目地依赖于.Sort()内置的语言之前,学习编程,循环和排序的基础知识从来都不是一个坏主意。
实际上,出于非常实际的原因,我认为作为第一语言可能是一个不错的选择:学习C ++之后,您遇到的任何其他语言似乎都变得轻而易举。
15-16岁时,我自学了C ++。
最好将魔力留给他人,自己学习事物的内部运作。
坦率地说,如果您不能弄清入门级的C ++语法和语义,您的计算机就不是那么好。没那么难。没有充分的理由避免使用“带有类的C”。
如果您希望学生开始着手进行模板元编程,推导多态调用并弄清多个继承层次结构,那么对于使用任何一种语言的入门级课程而言,这都是荒谬的。
想要掩盖学生编程的复杂性的趋势非常差。最终效果不佳(请参阅Spolsky的Java Schools论文)。如果他们不敢直截了当,那么这些人最终将成为DailyWTF成员。抽象泄漏,当(如果不是)抽象泄漏时,比必须处理它更糟。我曾担任入门级C ++学生的助教。要么必须将事物一直隐藏起来,要么必须将它们带入检查的视野。魔术是学习者的敌人。
如果我不得不推荐一种编译为机器代码的起始语言,那么Pascal变体可能是最好的方法。我记得,它比C族采用更常规,更结构化的方法。
我会说“不”-我有学习编程的渴望和渴望,并且马上就开始了我的大学入门课程,当时C ++马上就到了。加上一位正在教C ++的老师,好像它是另一门语言(对他们来说有意义的概念,不一定是该语言或现实世界应用程序的概念),并且每周都会对我们投掷项目,我因此而崩溃并被烧死一半的班级。到我什至可以消化,试验和应用所学内容的时候,我就为项目功课作了挣扎,而功课却是测试的两倍。我认为这是200级课程而不是100级课程。
我真的尽力了。我没有要求同情,我知道这将是一个挑战,但老师甚至都不会帮助我。就像我一直在做的那样,只是叫我去读教科书。
我会(有些人会不同意)认为Ruby或Python是一种更好的语言,可以将某人打入编程世界。干净,简洁,易读,更清晰的语法。
没有。
作为一种教学语言,C ++仅比C稍好,后者是周围最差的教学语言之一。它预先引入了很多复杂性,该语言的某些部分是非常不直观的,并且在大多数时候,您对C ++的了解要比对编程的了解更多。
这并不是说C ++(或C)是不好的语言,或者不值得学习。只是有更好的教学语言,例如Python。
string
数据类型,与需要在C中进行字符串处理的方式相比,它重载了,和操作符+
,这是学生或多或少希望学生做的事情。因此,“略微” 。我也不推荐任何一种教学语言。=
==
专上教育有两种基本类型:大学和商学院。区别在于您毕业后要准备做什么。在汽车领域,无论您是机械师还是机械工程师。
话虽这么说,如果您想成为一名工程师,C ++是一门很棒的第一语言,而如果您想成为一名相当于机械师的编程,那么它就是一本烂书。
C ++入门类将花费大量时间讨论数据类型,定义,声明,指针,内存分配等。如果您打算花费几个学期来学习如何做任何有用的事情,那么这是一个很好的基础,但是想知道,一旦到达那里,您就具有处理任何程度的复杂性的基础。
另一方面,如果您希望能够更快地执行有用的操作,但是不介意域和复杂性是否受到限制,那么将所有时间花在那些较低级别的概念上将是浪费。有很多程序员可以编写出色的html表单验证器,但不知道如何设计设备驱动程序。
当然。我的第一语言是C,但这实际上只是为了简化我们的C ++课程。我上大学后,Java变得更容易处理。C ++的学习曲线可能会稍微陡一些,但是如果教得正确,它应该没问题。
不,绝对不会。
如果我愿意的话,我几乎不允许在学术环境中使用它。不是因为与已经提出的原因相反,而是因为太多的人认为C ++(或其变体)几乎可以解决所有问题,因为您几乎可以在任何情况下使用它。它是编程的螺丝起子。
有些人用它来拧紧螺丝,这是完成工作的理想工具。其他人像撬棒一样使用它,虽然通常很有效,但并不十分理想,因为螺丝刀(不管您父亲会告诉您什么)都不是撬棒,并且由于滥用柄而造成的灾难性失败是因为柄的组成不是故意制造的对于撬杆会遇到的那种力量。还有其他人可能会尝试将其用作打孔器或凿子,并且它们几乎总是会遇到问题,因为螺丝刀的手柄并不是为打孔器或凿子设计用来承受这种冲击而制造的。
我认为,程序员的工作通常是将实际问题转化为自动化,从而在一定程度上提高效率(减少对任务的资源投入),速度(减少执行任务的时间),可预测性(提高可重复性)任务)或组织(提高对任务之间关系的认识)。
虽然可以理解,每个编程人员都应该对计算机的低级操作(尤其是设备IO和内存分配)具有一些常识,但确实很少真正需要在很大程度上利用该知识,更不用说将其用于绝大多数任务。试图在不了解问题的更广泛背景的情况下这样做会给工作带来不必要的风险。
荒谬的是,第一种编程语言应该是C / C ++或近似变体,因为C及其派生词所解决的问题类别肯定不适用于当前和将来任意比例的问题(除非必须挽救)一个以前用螺丝刀编写的程序),而实际上更多的只是一小部分即将到来的问题。尽管小型移动互联设备越来越流行,但大多数程序员永远不会接近开发核心OS功能或直接设备接口。大多数人会像我们一样工作和生活。修复并逐步淘汰已经使用了两代以上的代码,或者在已经表现出年龄的技术上实施,或者在killer(x + 1)应用程序的技术边缘进行工作。
对于第一种语言,我将看一下Lego NXT,它是LabView的轻量级但功能丰富的变体。尽管Lego NXT在商业企业中并未得到广泛使用,但它将展现以“传感器丰富”的方式进行编程的基本性质。我可能将其与某种平台无关的脚本语言(例如Javascript或TCL / TK)配对。就执行非常基本但有效的任务所必须发现的内容而言,这两种方法的影响相对较小,而在反馈回路和灵活性方面具有很高的回报率,从而可以引入和解决不同程度的问题复杂性。另外,它还为学生提供了一个很好的机会,使他们不断探索超越罐头环境所提供的潜力:有机会尝试在黑暗,潮湿,
在他们学会了自动驱动四缸发动机之后,如果他们真的很感兴趣和有动力,就将他们提升到大型v8手动hotrod。如果乔尔(Joel)在脚下的任何石头下都找不到摇滚明星程序员,那么他可能不得不继续寻找其他地方,或者重新考虑为什么他的工具箱中可能需要很多螺丝刀。
C ++是一种专家语言,而不是初学者……首先要说C,而不是Java,C#或Python……为什么?因为C教您注意内存和一些棘手的概念,例如所有语言都“隐藏”但无处不在的指针。我见过很多年轻的开发人员,他们甚至不理解为什么有时应该释放内存,并认为垃圾收集器并不是清除所有编码难题的小矮人:即使它们具有XXXXGb,它们也会实例化,实例化并使其爆炸。 RAM ...但是他们不明白为什么垃圾回收器不能简单地神奇地清理所有东西!而且我已经看到这种开发人员使用C ++(甚至在Corba中甚至更疯狂)进行编码,这真是个大招!!!!!!因此,我建议您学习C语言中的编码,然后使用Python / Java / C#了解对象概念以及所有相关知识。然后,当您了解了所有这些内容之后,您便会使用C ++,您会感受到C ++的强大功能,但同时也发现了C ++的所有危险以及为什么任何人都不应使用它;)
如果“适当”代表“可能”,则为是。如果说“好”,绝对不会。
可能甚至喜欢甚至喜欢C ++,但为此,您最好学习几种语言,并使用烂尾烂烂的代码库工作数十年,并获得“制作可实际使用的非凡软件”的经验-然后C ++将具有魅力。
处女时,不要一开始就摆弄一些小而简单的问题(但据说很有趣)。
我将从python开始,然后是SICP(方案)或类似的东西。可能颠倒或交错。有了这些,您就可以解决问题。与其在系统中作斗争,不如走进深渊,学习各种不合逻辑的怪癖及其历史原因。
稍后,当您已经可以从纸袋中编程出路时,切换到裸机:学习组装方式和几种架构,以及Knuth's Mix。我并不是要记住操作码或做很多实际的事情,只是为了了解内存,寄存器,ALU,缓存,中断以及达到读取级别。
这样,您便可以使用其他语言,包括C ++。在两者之间添加一些“语言的历史和演变”也许是个好主意。
我从中学开始使用C ++。我拿起了这本书的副本:Deitel和Deitel撰写的C ++ How to Program。这本书相当不错。
坦率地说,这里没有对与错的答案,我个人发现C ++是可以理解的。我一直到OOP都学到了这一点(我被“ this”绊倒了,但现在我不明白我怎么也无法理解)。试试吧,不要灰心。如果遇到困难,请检查其他语言,并继续学习新语言。这个想法是,当您以2-3种不同的形式看到相同的概念时,您会更好地理解它们。就像我说的那样,“ this”指针的概念使我感到困惑,但是当我在Python中看到相同的东西(取而代之的是self)时,这对我来说很有意义,因为我已经在C ++中理解了它。如果您能像许多大学一样学习Java,请一定要学习。一定要学习python或ruby,因为它是您的语言,如果您可以探索更多特定市场/新事物,例如Clojure(以及所有其他lisps),Haskell,Scala ...
不,我将从Java或C#开始。如果您想学习C ++,则在学习了基础知识(例如什么是类,如何执行循环和派生(if,then语句)等)之后,可能会更容易。学习如何看待C ++更为重要。问题或数学方程式进行编程,然后确定是否释放了所有内存或其他内容。
初学者需要首先欣赏“编程”。根据我培训初学者的经验,他们首先赞赏他们最了解的内容。像Python与C#一样,他们喜欢Python,因为它非常高级,并且不像C#那样使用符号,这意味着它非常接近人类语言,也非常接近英语。因此,我建议您学习从高级到低级的编程。