我知道如何编程,如何学习编程,但是您如何/在何处学习如何正确制作系统?[关闭]


11

制作系统时,需要考虑很多事情,例如,基于Web的系统,用户登录并彼此交互,创建和编辑内容。现在,我必须考虑安全性,验证(我什至都​​不认为我100%地确定了其中的含义),“确保用户不要互相踩踏”(这是术语?),从而防止了许多错误确保数据库数据不会因意外情况而出现问题?所有这些我不知道如何学习或在哪里学习的东西,有一本书关于这种东西吗?就像我说的那样,编写代码和实际编写正确的代码之间似乎有很大的区别,知道我的意思吗?我觉得我目前的编程工作缺少我所描述的内容,以后我会看到它引起的问题,然后问题就很难解决了,因为存在数据并且人们正在使用它。那么,有人可以将我指向这类学习的书籍或资源或正确的编程子集吗?

PS:随时纠正我的标签,我不知道我在说什么。

编辑:我假设我写的一些示例也适用于其他类型的系统,我只是不知道任何其他好的示例,因为我主要从事网络工作。

Answers:


10

据我所知,专业程序员通过以下三种主要方式学习这些东西:

  1. 从不良经历中学习 -您遇到了错误。您修复它。您说:“嘿,我不应该再这样做了。下次我要X。” 您显然处于困境之中。
  2. 在糟糕的经历之前学习 -最终,您将学会看到某些问题的出现。当您这样做时,您将尝试避免它。也许您读了一本书,也许您在网上搜索,也许您尝试了一些实验。
  3. 向经验丰富的同事学习 -尽管这仍然不容易,但这是最简单的方法。诀窍是弄清楚同事是否正在应对仍然有意义的不良经历。毕竟,技术在进步。

我鼓励你为这三者投篮。与聪明,经验丰富的同事一起解决您的问题,找到一个合适的地方。确保它是一个可以让您提前且经常发货的地方,以便您可以尝试很多事情。并花一些时间进行研究和思考。


对于#1),请记住,您从中汲取的不良经验和错误不一定是您自己的。花时间在网上,闲逛程序员在哪里,学习一些他们犯过的或遇到的疯狂错误的恐怖故事,在编程时将它们放在脑后。
Shadur 2011年

1
我同意,Shadur,但我认为某些不良经历的确需要由您自己承担。有些人试图坐在一边,等到他们做出完美的东西。但是,如果他们想提高自己的技能,他们真的需要进入那里并开始做。
威廉·皮特里

4

当涉及到网络应用程序时,与我见过的任何其他地方相比,此答案中汇集的信息更多。

但是现实是,要把一个完整的系统很好地组合在一起,有很多知识。有研究支持10,000个小时,这是达到精通水平所必需的实践量,开发信息系统也不例外。


所以我想这对不同的事物来说是不同的,是吗?
MetaGuru

例如,许多问题将特定于Web应用程序,而许多问题将更为普遍。不确定我是否完全理解您的要求。
2011年

3

我非常喜欢William Pietri的答案(+1),但我认为需要添加它。甚至假设您所说的系统仅包含软件。

但是在深入探讨之前,我不知道有什么书可以帮助您。接下来的所有事情,我都从经验中学到了(意思是威廉提出的三点)。

您所讨论的范围至少具有四个主要角色。有时,一个人可能会担任中小型项目的所有这些角色,但是当您开始进行大型项目时,至少需要将这些角色分开。任何人都很难以任何有意义的方式来精通他们。

  1. 业务分析师

    那就是与客户交谈并将他们的需求转化为架构师可以理解的东西的人。基本上是正确制定的​​要求列表。这包括明显的功能需求(该系统必须交付什么?),还包括非功能需求(系统必须满足的一般特征是什么?)可能包括安全性,可靠性,可用性,弹性,容量,性能,健壮性和从用户的角度来看其他此类要求)。

    这是系统必须做的第一步,是认真思考的开始。

  2. 系统架构师

    这个人产生了在其中工作的高级技术框架。他们给出了轮廓匹配计划。通用工具,技术,构造。他们将整个系统分解为更小的组件,它们如何相互配合,如何与外界相适应...

    这在许多方面有助于完善需要考虑的内容。在那个阶段,通常会发现与业务分析师编写的需求有关的问题。回到他们那里进行一些迭代,以提高他们对所需内容及其表达方式的理解。

  3. 系统设计师

    这个角色是关于如何使其全部工作的。与单人表演相比,这可能是更多的团队合作。但是可能会有首席设计师来监督整个系统的设计。这个人必须深入研究细节,并确保建筑师的观点是可以实际构建的。

    期望进一步完善系统的体系结构,从而可能进一步完善业务分析。

  4. 测试经理

    这个角色经常被遗忘。但是,如果最终无法测试,怎么证明自己可以构建呢?必须对所有阶段的结果进行审查:具有测试能力的人员可以进行业务分析,体系结构和设计,以便能够突出缺陷,因此可以在编写任何代码之前进行早期更正。

这是一个简短的摘要。

那些家伙/女友只是链条中考虑必须考虑的事情的一般人。

对于大型银行或航天应用之类的复杂项目,仅举两个例子(想想成百上千个工日),有许多主题专家,我们称其为每个阶段的项目审查和支持。这些角色包括安全分析,系统大小确定,容量,性能,数据库,群集以及许多其他狭窄的专业领域,包括精确的业务领域。角色的多样性取决于系统的大小和复杂性。

所有这一切都表明您不应该尝试并了解全部内容,而您不会。但是,您可以了解整体情况,在小型项目中,您可以深入研究大型项目,而不仅仅是大型项目,这是因为复杂程度可以使您更加全面。

如果您想知道如何设计系统,那么您需要先在框外思考,然后再提出问题。将自己放在客户的鞋子上,尝试思考可能出问题的地方,需要测试的地方。然后与真正的客户聚在一起,推动他们解释他们所期望的系统范围和限制。另外,每当我说“客户”时,您都必须理解,这包括几个非常不同的人。有人每天都在使用系统来完成其设计工作。有操作员,技术支持,需要报告或其他报告的经理,审计师,基础架构团队,为报告付费的利益相关者,需要手段来测试系统的质量经理...询问所有这些人(以及是否他们是一个人,让他们一次把所有这些帽子戴上),然后问他们所有他们需要什么,这样您就可以很好地了解系统要求。从那里您可以得出体系结构,然后从那里进行设计。

对于复杂的系统(无论是仅软件还是最一般意义上的与硬件集成),不仅我一个人不足以胜任上面列出的四个角色,而且甚至需要对系统必须定义的内容进行项目管理。这样做,更不用说其他阶段了。

HPH,ASM。


2

在这里学习,有没有关于这种东西的书?

不是“一本书”。很多书。

没有皇家之路

就像我说的那样,编写代码和实际编写正确的代码之间似乎存在巨大差异

对。

您在谈论“架构”,即大型编程。

步骤1.阅读大量代码。真的很多。想想你想做的事情。查找相关的开源项目。阅读代码。所有的。

步骤2.阅读更多代码。多很多。

步骤3.阅读有关建筑的书籍。


2
阅读,阅读,阅读。但是我必须建议,这与您在实际实施真实系统时所学的知识不同。
2011年

@qes:问题是“您在哪里学习如何正确制作系统?” 您不会通过糟糕地构建实际系统来了解这一点。确实,糟糕地实施实际系统与学习完全相反。
S.Lott

3
在Code Complete中,我最喜欢的事情之一是:“软件工程领域非常有限地使用了过去的成功和失败的例子。如果您对建筑感兴趣,则可以研究[著名建筑师]的图纸...参观一些建筑物...”。
雅各布

@ S.Lott:谁说得不好?
2011年

@问:不读现有技术,做好大型程序的几率是多少?对于像您这样的天才,有可能一个人可以随时随地简单地编写好的程序。但是对于其他没有进行大规模编程的人,首先尝试在不读取任何内容的情况下实现大型系统,这是编写包含许多错误以至于无法学到任何东西的方法的途径。您的经历可能有所不同,但我知道我没有足够的智慧就无法不先阅读而工作。
S.Lott

1

为了扩大阅读的书...

现在您知道自己有问题,可以告诉您阅读这些书。(在完成一些实际工作之前,讨论这些书毫无意义)

程序设计1,2,3和4的Gamma,Helm,Johnson和Vlissides模式语言的设计模式

但不要尝试将所有模式都应用到您认为可以使用的任何地方

这也是一件坏事。

希望这可以帮助。


1

学习如何做任何事情的最好方法就是去做。如果您想学习说法语,则必须说法语,阅读法语,写法语,阅读有关法语的信息,然后去法国与法国人交谈。如果您想知道如何弹钢琴,则必须实际弹钢琴。您必须弹奏简单的歌曲,并学习钢琴的结构和音乐的结构。您必须学习如何阅读音乐,以及如何用手指通过钢琴表达音乐。您必须了解音乐听起来像什么,钢琴可以发出什么样的声音,而吉他,长笛或萨克斯管却可以发出什么声音。

编程是完全一样的。如果您知道如何设计数据库,则必须设计数据库。如果您想了解加密技术,请实施加密算法和加密协议。如果要编写可以同时为多个用户服务的软件,则必须了解磁盘IO,网络IO和线程的工作方式。要了解它是如何工作的,您需要编写可从文件读取和写入,通过网络传输数据并同步对资源访问的代码。所有这些都需要实践。

通常,“系统”只是东西的集合。协调形成整体的碎片。要构建大型产品,您必须构建一堆小零件。因此,如果您想学习如何构建系统,只需开始构建系统。处理一个问题,分解为各个部分,然后逐个实施。最终,您将拥有一个集成的“系统”。在此过程中,您可能会失败几次,但这没关系。如果您没有失败,通常意味着您没有足够努力。

另外,我建议去学校学习计算机科学。这对“练习”部分没有太大帮助。您必须自己执行此操作,但这将有助于曝光部分。您将学到很多东西,几乎所有与计算机和计算机系统的工作方式有关的东西,而这些东西很难自己学习。


1
+1,尽管我建议仅仅做是不够的。您将不知道自己做得好不好,直到一段时间后重新访问同一代码。即便如此,您可能仍然知道出了点问题,但还不知道如何改进。简化所有方法的一种方法是确保从经验丰富的人那里获取大量Promtp反馈,以了解您要学习的内容。是的,“做”很重要,但是对您所做的事情的反馈甚至可能更多,以加快学习过程。
Marjan Venema
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.