加快现代建筑的步伐


18

我没有任何计算机科学的正式资格,而是在互联网泡沫时代,我教了自己经典的ASP,并设法让自己找到一份工作,我的职业生涯从此开始。我对ASP 3的程序员很有信心,我认为这是一位很好的程序员,但正如其他人观察到的,传统ASP的一个问题是它在隐藏http的本质上做得非常好,所以你可以变得非常胜任一个程序员是基于对你正在使用的技术相对较差的理解。

当我开始转向.NET时,我把它当作经典的ASP来处理,因为我当时并不知道任何更好的东西,所以将独立应用程序开发为单个网站。我在这一点上转移了工作,并在接下来的几年中花费在一个单独的站点上,这些站点的架构严重依赖于自定义对象:换句话说,我获得了很多使用.NET作为中间层开发工具的经验,沿着经常用于教OO的经典“汽车”类示例的方式进行OO设计。将程序分解为多个功能块,并围绕这些功能建立类和方法。尽管我们采用敏捷方法来管理工作,但整个设置仍然是经典的客户端/服务器。这适合我,我逐渐接触.NET,并开始以它应该的方式使用它,并且我开始看到技术中固有的力量,以及它为什么比好的ASP 3更好

在我最近的工作中,我发现自己突然陷入了与两个相当年轻,技术娴熟和非常尖端的程序员的深层次。他们已经建立了一个网站架构,它沿着很多新东西进行建模,而这些东西对我来说都是新的,事实上我有很多麻烦的理解。该应用程序建立在具有多租户的云计算模型上,并且该架构全部使用大量接口,工厂等进行松散耦合。他们也使用nHibernate。我加入后不久,这两个人就离开了,我现在应该是一个系统的高级开发人员,他的技术和架构我不太了解,我也没有人提问。

除了你,互联网。

坦率地说,我觉得我已经在深处投入了,而我正在下沉。我不确定是否这是因为我缺乏理解这些东西的教育背景,如果我现在对数学计算没有足够的数学意义(我的数学从来都不是很好 - 我的设计方法通常只是调试直到它工作,然后重构,直到看起来整洁),或者我是否只是一次性提出太多过于激进的本质。但找出它是唯一的方法是尝试和学习它。

所以任何人都可以建议一些好的地方开始?好的书籍,教程或博客?我发现很多互联网材料只是预设了我没有的理解水平。

您的建议非常感谢。帮助一个中年人,陷入泥土开发者再次激起热情!

请!

+6

你哭泣穿越StackOverflow上的文本限制。我会在今天晚些时候发布我的答案,但现在我只想说:放松,深吸一口气,我们会给你一些buoies和潜水装备。 15 4月. 102010-04-15 10:11:11

  0

谢谢:)并感谢大家提出的建议,目前为止 - 将检查一些书籍和链接建议。 15 4月. 102010-04-15 10:36:40

+1

不要低估这两位程序员有多糟糕。仅仅因为它看起来令人印象深刻,并不意味着它令人印象深刻或做得很好。这对于一个非常熟练的程序员来说可能需要几个月的时间才能放松。首先寻求理解,你有正确的方法。一旦你了解了,你就需要乐意进行破解和砍杀。祝你好运。 15 4月. 102010-04-15 13:23:50

8

坐在沙滩上 - 准备

制作一个你不明白的东西的清单。在最后阶段,这个清单应该是你的清单。清除你的想法 - 让自己重新开始,“忘记”你已经了解的关于你的架构的所有令人困惑的细节。 挖掘由原始建筑师创建的每个文档。 获取项目中使用的每种技术的文档。 做咖啡。

浮动 - 管理复杂

浮动,你需要管理的复杂性。如果你没有正确处理复杂性,当你完全没有必要的时候,你会深入细节,你不知道如何以及在哪里停止,沉入底部并溺水。

“我对设计方法往往 简直调试,直到它的工作原理,然后 重构,直到它看起来整洁”

我想我曾经是你一样。我从头开始开发解决方案,一次添加一件,最终在我头脑中包含一个复杂的结构。我没有规划架构,我没有分离设计和实现,我只是编码,调试,重构。它的工作原理是:由于复杂性增长缓慢,所以我不难理解出现的架构。

当“继承”他人计划的复杂架构时,这种方法根本不够好;你不能一次吞下整个结构 - 因为细节太多了,你不能随意吞下一点点 - 因为你不会理解它们是如何相互关联的,你永远也看不到大局。

软件是复杂性管理的难题。有很大的部分,有时被称为“子系统”,构成了全局。每一个都由较小的部分组成,而这些部分又由较小的部分组成。当你看代码时,你看到的只是最小的一块。所以现在忘记代码本身,至少在你看到所有更大的代码之前。

游泳 - 映射的架构

走向浮动是看到了大块的第一步。要做到这一点,你需要地图。最大块的地图是最高级的架构。如果原来的建筑师没有给你这样的地图,你必须自己创建。就像从山谷内部映射一个区域是不可能的,你不能从低层次的细节映射你的架构。您需要站在山顶才能360度观察所有的山谷,山丘和小径。您需要从顶部映射您的架构。

拥有此顶层地图后,您应该为构成它的部分获取地图 - 就像创建整个地区的非详细地图一样,然后创建分区域的单独详细地图。地图应描述不同的子系统。至少应该描述每个子系统的责任,其外部接口以及它如何与其他子系统交互。

跳水 - 管理细节

有这一原则潜水它说你不应该深处过快之间移动,因为在压力的变化。这个原则成立。当您从处理一个子系统转变为处理其内部子系统时,请确保您只是进入下一个复杂性/抽象级别。让你的头脑一次处理一层。

单独的概念,模式,接口和实现。 nHibernate是一个对象关系映射(ORM)解决方案。因此,在处理nHibernate本身的细节之前,您需要确保您了解ORM的一般概念及其在世界中的位置。工厂是一种设计模式,所以在处理工厂之前,您应该了解什么样的设计模式以及它们的作用。

技术上升和下降,但概念依然存在。一旦你了解了这些概念,在架构层面上,这些概念如何表现出来并不重要。

,你的架构松耦合的事实其实是一件好事,因为这意味着你能理解一个子系统的作用,而不需要知道很多关于其他子系统。您的架构使用接口的事实也很好 - 这意味着您可以了解元素如何互相交互,而无需了解其内部如何工作。

滑水 - 获取知识精华

有一本书,我认为这是一个“必读”:代码完成由史蒂夫·麦康奈尔。它改变了我的职业生涯。


我希望这篇文章能以某种方式帮助你,而不是完全浪费你的时间。

  0

谢谢。将这些建议付诸实践需要一段时间,但我觉得你已经将自己的手指放在了为什么我觉得自己在挣扎中 - 试图一次性吞下它。你在思考和构建这篇文章的时候非常感谢! 16 4月. 102010-04-16 08:38:52


3

Patterns of Enterprise Application Architecture是一本很好的书,马丁是个传奇。


2

如果是关于架构,如果是关于Microsoft开发堆栈,我总是会看到Pattern & Practices

他们有很多关于各种应用程序类型的体系结构的优秀白皮书/书籍。


6

除了很多很好的资源已经在答案中列出并且很可能会被列出,稍有不同的建议 - 使用StackOverflow。

你似乎能够写得非常周到,可读,敢于说出很好的问题。因此,只要某个特定的特定的架构选择/模式或代码段没有任何意义,可以随意将它变成一个SO问题(显然是在自己重新研究一下之后理想的情况下)。

此外,关于你的观点重:数学:

至于软件工程而言,你真正需要的大部分时间只有数学是:

  • “离散的数学” - 集合,图表,树木等...及其实际应用到数据结构和算法

  • 一个有限的代数技能集参与分析后者的O(n)复杂度

  • 理想情况下,直观地掌握统计/概率 - 作为一名通用软件工程师,您并不总是必须能够进行高级计算,但感觉“这更可能影响我的情况发生的可能性乘以其影响的大小“通常是设计选择的良好指导。

然而,一件事是在一个优秀的软件工程师,往往是无价什么区别“擅长数学”,从“在数学不好”的人 - 而不是严格意义上的相关数学 - 是看模式的能力。

如果你“不擅长数学”的原因是你缺乏模式遵守能力,那么你将处于很大的劣势。这是你必须在自己身上训练超过所有其他人才能成功构建系统的技能/能力,恕我直言。

  0

“离散数学” 23 4月. 102010-04-23 19:14:19


7

这里有一些建议,绝不是完整的how-to或all-in-one答案;

  • 在工作日花时间学习新的东西。在你工作的一天中这个时间,因为它是你工作的一部分。这不是你应该只在晚上或周末做的事情。如果你想花一些时间去学习它,请继续前进,但不要忘记学习是你工作的一部分,不要忘记你必须在家里隐藏自己的无知,不知道一切对你的职业生涯是致命的。平衡学习时间和工作时间取决于你。

  • 获得一些大张纸和一盒彩色铅笔(或MS Visio,如果您愿意的话)。开始绘制两种类型的图表:

    • 思维导图,用以图示您对新技术的理解。如果你不知道什么思维导图,请点击维基百科开始。
    • 您负责的系统架构图。无论您使用UML还是其他广泛使用的格式,或者您自己的设计都由您决定。
  0

正是! +1。查看代码并绘制您看到的内容,以帮助查看连接并从中学习。 15 4月. 102010-04-15 10:38:58

  0

+1有很多东西可以说是制作一个图表/电路图/任何东西,不需要甚至远远接近正式。这是视觉组织,尤其是创建图表的行为,这是最重要的。 07 8月. 102010-08-07 10:28:07


0

我见过像你过去的情况也是如此。但通过专门的日常阅读和parctise,他们似乎和其他任何“年轻的,所谓的优秀程序员”一样。如果我在你的位置,这是我会做的:

  • 分解我的麻烦领域成小块。
  • 将搜索可用于上述列表中的主题的书籍/文章。
  • 将自行编码样本并对其进行实验以获得更好的理解。

话虽如此,不要担心abt没有一个数学的心灵弯曲。我自己是一名数学学生,说实话,当我必须使用这些技能时,很多场合都没有。 “大多数”企业应用程序不需要这种数学技能。除此之外,modenr day apis非常先进,易于使用,因此您不必为编写高效的排序算法或任何此类问题而烦恼。

尝试尽可能多地阅读设计模式。 “首先设计模式”是一本很好的书,但代码示例是使用Java语言编写的(不应该重新考虑)。 “UML蒸馏”是另一本好书。还有很多其他可用的,只是谷歌:)。 另外,请仔细阅读您现有的系统。

所有最好的..


0

坦白说,我觉得我已经在深水的一端被投 ,我下沉。 我不知道这是因为我缺乏 教育背景 了解这个东西,如果我根本不 对数学现代 足够的计算头脑(我的数学从来没有 伟大的 - 我的方式来设计往往是 简单地调试,直到它的工作,然后 重构,直到它看起来整洁),或 是否我简单地提出了 与太多激进太性质 一次。但要找出 的唯一方法就是尝试并学习它。

对我而言,这是因为你缺乏教育背景。人们在学习自己或在工作中经常没有必要的背景来真正理解框架背后的背后。 一些概念对于所有信息系统都是通用的,我们可以在学校学习它们,因此我们可以理解这些概念如何在每种语言中起作用......您似乎更像一位务实(高效)的程序员,但您会犯错误的是您没有那么一般的背景(但是在这种情况下,你应该知道你并不孤单......特别是PHP开发我认为没有这个背景)。

如何理解代码与数据库,ORM之间的关系如Hibernate,如果你不完全知道什么是事务(我猜你知道如何使用它......(务实的我说!)但你永远不会听说过ACID这样的概念:http://en.wikipedia.org/wiki/ACID,我想你对事务隔离并不了解)。

如何使用web服务与,RPC SOA架构,RMI,CORBA ...高效,能够在你的数据库数据一致,如果你不知道的一些概念,如2个phaze提交 http://en.wikipedia.org/wiki/Two-phase_commit_protocol

如果您不知道很多设计模式,最佳实践,并且不知道何时使用它们,那么如何编写出色的代码?

我们可以说很多事情。

事实只是你错过了工程师学生们所有(通常?)拥有的信息知识的一部分。当我们开始在一所工程师学校工作时,我们并不擅长这些事情,但与您唯一的区别是我们知道非常重要的概念存在以及何时应该使用它们。因此,我们只需阅读相关内容并应用我们从网络或我们团队学到的知识(因为在学校我们几乎看不到基础知识,但在很多技术人员身上)。

我真的认为对你来说没有什么是不可能的,你应该真正了解你不了解的一般概念,并且你听到了很多。如果没有这方面的知识,你就会倾向于重新发明轮子,而你的实用主义会找到一些可行的解决方案,但它们只是有点脏......例如,你的开发人员可以工作,但是当你在系统中引入高负载时,你可能有并发问题,性能问题。这种知识的缺乏是不是在找你一个简单的背景,但真正需要的,当你有很多复杂的系统上responsabilities的问题...