“您将如何构建此网站/应用程序”面试问题的一般思考过程[关闭]


14

我收集了许多面试问题,例如“描述如何设计相册应用程序”,“描述如何设计此特定网站的特定功能”(例如在Facebook上喜欢,在亚马逊上推荐,购物车,游戏黑色杰克)。那么,如果有成千上万的东西呢?你会改变什么?

看起来这是在期待数据库架构还是一堆类定义(或两者都在?)。我在学校里已经学习过数据库,但是我以前从未真正设计过一个应用程序,并且很难知道从哪里开始,我提出的设计是否“好”以及我可以进行哪些更改以使其可扩展。

设计这些系统时是否有一般的方法或思考过程?我应该设法避免的一般问题/设计中出现的很多问题?有人可以指导我讲解其中的一个(或最好是全部,同时比较每个人的需求)并解释一下:

1)您如何提出需要哪些实体?2)您如何决定一切将拥有什么关系?3)您如何将性能优化纳入设计?4)我使用类或数据库吗?会有所不同吗(例如,我是否有一个不能真正转换为数据库表的类?)

我问的主要原因是因为我正在经历“破解编码面试”,我的答案与作者的答案完全不同-我对重要的类有不同的看法。

我的尝试: 使用照片共享应用程序,我将获得以下课程/表格:可以肯定的是照片和用户。

然后,我认为如果我们尝试创建模式,那么如果我们假设照片中的每个人都链接到照片,那么将存在一个链接照片和用户的表格(此表格是否必要?如果不是,是否仍然是惯例?是否有用于多对多关系的单独表格?)。

但是,如果我们尝试采用一种面向对象的方法,也许我们会拥有一个名为Album的类,它可以完成所有工作并具有来自其他两个表/类的所有信息。这是我在书中注意到的一件事-有一堆类,然后一个类基本上具有所有信息并连接了其他类-这是常见的吗?例如,在我上面的示例中,这似乎适用吗?

我只是希望遵循一些通用规则/准则,因为现在我还不知道如何判断大型系统的良好架构是什么样的。


1
假设您将相册编码为一个爱好项目。而不是问“我在正确的轨道上吗?” (当然,因为所有的需求都将以某种方式满足),您可能会问:“感觉这方面的设计使事情变得不必要地尴尬;我们可以改变周围的事物来简化一切吗? ” 但是,您怎么知道设计中有一些笨拙的方面呢?通过研究用例和最坏情况的思想实验。另外:“这种登录要求很常见;我们可以找到一个图书馆而不是自己重新创建它吗?”
Evgeni Sergeev

Answers:


19

这些问题的重点是评估您是否具有编写软件应用程序的实际技能。您已经学过一些理论,但是理论知识只能走这么远。真正理解软件开发的唯一方法就是这样做。

没有捷径可走,因为没有诸如“需要什么实体?”之类的问题的常规答案。取而代之的是,您必须运用各种工具和范例的经验以及它们如何协同工作,以提出针对当前问题的实用解决方案。

诸如“我是否使用类或数据库来执行此操作?”之类的问题。建议您缺乏有关什么是事物以及它们如何工作的基本知识。 是组织代码的范例。数据库是一种数据存储方法。它们是两个固有无关的概念(尽管它们可以一起工作)。这不是一个非此即彼的问题。

我并不是要苛刻,但我认为您需要发展自己的编码经验,才能在这样的工作面试中取得成功。您肯定有潜力-您对照片共享应用程序的讨论具有一些正确的想法,并且朝着正确的方向前进。但是,您需要直接了解其工作原理。准备面试的最佳方法是从头到尾实际创建一个应用程序。照片共享应用程序将是一个适当大小的项目,或者您可以选择其他内容。当您看到所有部分如何协同工作以创建有效的应用程序时,您的知识将会真正得到扩展。


8

看起来这是在期待数据库架构还是一堆类定义(或两者都在?)

我认为您在这里过于关注细节。有了这个问题,招聘人员就不会期望您将要编写的所有类都有完整的说明(否则,他们会要求您编写代码,而不是谈论它)。

首先,您的答案需要涉及大局-体系结构,层,层,甚至是您将要采用的项目生命周期和开发过程。不要犹豫,询问有关应用程序应在其中运行的条件和环境的问题,以调整您的答案。正如dan1111所指出的,没有正确的应用程序设计的通用方法。所有设计均取决于上下文。

仅当招聘人员开始提出真正具体的问题时,您才应详细了解将在后台使用哪些类,实体或数据库表。

另外,如果您经验不足,通常会​​说:“我将向您展示使用迄今为止我教过的和使用过的应用程序设计类型的解决方案。我知道这一点以及可以用来描述您的其他方法在大多数情况下,但从未真正应用过它们。我也乐于发现和应用其他应用程序。”

承认工具箱中只有这么多的工具可以使您拥有丰富的经验,这没什么不对的-实际上,这比吐出一个排练的答案要好得多,您不知道它在实践中是如何工作的。


2

我想对您的第一个问题做一个简短的评论:

1)您如何提出需要哪些实体?

对于新项目,我要做的第一件事是在白板上或大白纸上写下我和我的团队可以想到的有关该特定项目的所有物理和概念性内容。这是一次头脑风暴会议。

名词往往是宾语,动词往往是用例或方法。

物理:照片(很明显!),显示类型,系统,照片文件,文件格式,用户,日期...。
概念:添加,删除,保存/存储,检索,分类,修改,查看/显示照片。

在名词和动词之间建立联系。用户添加照片。(嗯-有一个用例!)

我还建议您查看UML和设计模式,以及如何在通用OOD中使用它们。(注意-在上面的任何地方我都没有提到语言或数据库。不要选择一种语言,然后再进行OOD。请按照可以由任何OOL实施设计的方式进行OOD。

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.