-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path视频新闻面试问答说明书.html
378 lines (322 loc) · 17.2 KB
/
视频新闻面试问答说明书.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>视频新闻面试问答说明书</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
/* GitHub stylesheet for MarkdownPad (http://markdownpad.com) */
/* Author: Nicolas Hery - http://nicolashery.com */
/* Version: b13fe65ca28d2e568c6ed5d7f06581183df8f2ff */
/* Source: https://github.com/nicolahery/markdownpad-github */
/* RESET
=============================================================================*/
html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
}
/* BODY
=============================================================================*/
body {
font-family: Helvetica, arial, freesans, clean, sans-serif;
font-size: 14px;
line-height: 1.6;
color: #333;
background-color: #fff;
padding: 20px;
max-width: 960px;
margin: 0 auto;
}
body>*:first-child {
margin-top: 0 !important;
}
body>*:last-child {
margin-bottom: 0 !important;
}
/* BLOCKS
=============================================================================*/
p, blockquote, ul, ol, dl, table, pre {
margin: 15px 0;
}
/* HEADERS
=============================================================================*/
h1, h2, h3, h4, h5, h6 {
margin: 20px 0 10px;
padding: 0;
font-weight: bold;
-webkit-font-smoothing: antialiased;
}
h1 tt, h1 code, h2 tt, h2 code, h3 tt, h3 code, h4 tt, h4 code, h5 tt, h5 code, h6 tt, h6 code {
font-size: inherit;
}
h1 {
font-size: 28px;
color: #000;
}
h2 {
font-size: 24px;
border-bottom: 1px solid #ccc;
color: #000;
}
h3 {
font-size: 18px;
}
h4 {
font-size: 16px;
}
h5 {
font-size: 14px;
}
h6 {
color: #777;
font-size: 14px;
}
body>h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h4:first-child, body>h5:first-child, body>h6:first-child {
margin-top: 0;
padding-top: 0;
}
a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
margin-top: 0;
padding-top: 0;
}
h1+p, h2+p, h3+p, h4+p, h5+p, h6+p {
margin-top: 10px;
}
/* LINKS
=============================================================================*/
a {
color: #4183C4;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
/* LISTS
=============================================================================*/
ul, ol {
padding-left: 30px;
}
ul li > :first-child,
ol li > :first-child,
ul li ul:first-of-type,
ol li ol:first-of-type,
ul li ol:first-of-type,
ol li ul:first-of-type {
margin-top: 0px;
}
ul ul, ul ol, ol ol, ol ul {
margin-bottom: 0;
}
dl {
padding: 0;
}
dl dt {
font-size: 14px;
font-weight: bold;
font-style: italic;
padding: 0;
margin: 15px 0 5px;
}
dl dt:first-child {
padding: 0;
}
dl dt>:first-child {
margin-top: 0px;
}
dl dt>:last-child {
margin-bottom: 0px;
}
dl dd {
margin: 0 0 15px;
padding: 0 15px;
}
dl dd>:first-child {
margin-top: 0px;
}
dl dd>:last-child {
margin-bottom: 0px;
}
/* CODE
=============================================================================*/
pre, code, tt {
font-size: 12px;
font-family: Consolas, "Liberation Mono", Courier, monospace;
}
code, tt {
margin: 0 0px;
padding: 0px 0px;
white-space: nowrap;
border: 1px solid #eaeaea;
background-color: #f8f8f8;
border-radius: 3px;
}
pre>code {
margin: 0;
padding: 0;
white-space: pre;
border: none;
background: transparent;
}
pre {
background-color: #f8f8f8;
border: 1px solid #ccc;
font-size: 13px;
line-height: 19px;
overflow: auto;
padding: 6px 10px;
border-radius: 3px;
}
pre code, pre tt {
background-color: transparent;
border: none;
}
kbd {
-moz-border-bottom-colors: none;
-moz-border-left-colors: none;
-moz-border-right-colors: none;
-moz-border-top-colors: none;
background-color: #DDDDDD;
background-image: linear-gradient(#F1F1F1, #DDDDDD);
background-repeat: repeat-x;
border-color: #DDDDDD #CCCCCC #CCCCCC #DDDDDD;
border-image: none;
border-radius: 2px 2px 2px 2px;
border-style: solid;
border-width: 1px;
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
line-height: 10px;
padding: 1px 4px;
}
/* QUOTES
=============================================================================*/
blockquote {
border-left: 4px solid #DDD;
padding: 0 15px;
color: #777;
}
blockquote>:first-child {
margin-top: 0px;
}
blockquote>:last-child {
margin-bottom: 0px;
}
/* HORIZONTAL RULES
=============================================================================*/
hr {
clear: both;
margin: 15px 0;
height: 0px;
overflow: hidden;
border: none;
background: transparent;
border-bottom: 4px solid #ddd;
padding: 0;
}
/* TABLES
=============================================================================*/
table th {
font-weight: bold;
}
table th, table td {
border: 1px solid #ccc;
padding: 6px 13px;
}
table tr {
border-top: 1px solid #ccc;
background-color: #fff;
}
table tr:nth-child(2n) {
background-color: #f8f8f8;
}
/* IMAGES
=============================================================================*/
img {
max-width: 100%
}
</style>
</head>
<body>
<h1>视频新闻面试问答说明书</h1>
<p>对于程序员面试, 面试者常常从下面这四个方面考察应聘者:</p>
<ol>
<li>以前的工作经验.</li>
<li>是否符合公司文化.</li>
<li>编程技能.</li>
<li>分析能力和沟通能力.</li>
</ol>
<p>如果你的沟通技巧好, 对常见的面试问题足够熟练, 就能在面试中充分地展现你这四个方面的能力. 由于大多数程序员对面试准备不足, 对沟通能力重视程度不够, 只要你有所准备, 往往能更好地推销你自己, 放大你的个人能力, 在面试的竞争中脱颖而出.</p>
<p>下面是一些常见的面试问题, 对于每一个问题, 请思考你的回答各表现了你四个方面的什么能力, 是否突出了你某一个方面的优点? -- 你的回答一定要有针对性, 把自己想象成一个推销员, 而不是在漫无目标地应付别人的刁难.</p>
<p><strong>注意:</strong> 以下回答仅供参考, 不要生搬硬套. 如果你要用类似的回答方法, 对于一些技术性概念, 如"HLS", "FFmpeg", "流媒体", 一定要先百度一下, 如果面试官问一些延伸性的问题, 你起码要能答两句.</p>
<h2>一 项目介绍性问题</h2>
<p>项目介绍性问题是在考察你<strong>以前的工作经验</strong>, 另外, 你需要把项目的需求, 目标, 设计原则等用非技术性的语言表述清楚, 这也体现了你的<strong>分析能力和沟通能力</strong>.</p>
<h3>1. 请简单介绍一下你们这个项目的背景和需求.</h3>
<p>这个项目是一个外包项目, 是为一个地方电视台做的配套的视频新闻app. 目标用户是当地一些对本地新闻比较敏感的电视观众, 另外还想通过app这种形式, 为它的新闻内容开辟新的用户群体.</p>
<p>核心需求有两点, 一个是要和每天的电视新闻同步, 用流媒体的形式发布新的新闻视频. 第二呢, 是要能让用户参与互动, 对新闻做评论, 投票等, 并能根据用户的浏览偏好主动推送他可能感兴趣的新闻和相关的一些商业信息, 提高用户的参与度.</p>
<h3>2. 你在这个项目中负责哪些工作?</h3>
<p>我们这个项目的客户端有三个人负责, 我是其中经验相对少一些的. 所以我是负责整个界面部分的实现, 另外大部分bug也是由我定位分析, 80%以上的bug最后都是我修改的.</p>
<p>另外我们这个项目大量涉及到了视频和流媒体的处理, 虽然我以前没做过, 但我很想学这方面的知识. 我跟项目经理说了这个想法后, 他把有一个页面的视频播放功能交给我来做了.</p>
<h3>3. 这个项目有哪些核心功能和主要页面?</h3>
<p>项目一共有17个页面, 其中最最核心的页面有5个:</p>
<ol>
<li>每日新闻页面, 这是一个新闻列表, 可以直接在列表中点击播放视频, 当视频滑出屏幕后, 也能自动停止播放, 这是通过MediaPlayer + TextureView实现的. </li>
<li>推荐新闻页面, 服务器会分析用户的浏览偏好, 向用户推荐个性化的内容, 在这个页面展示.</li>
<li>新闻详情页面, 在页面上半部分是视频播放窗口, 通过MediaPlayer + SurfaceView实现, 另外还有一个自定义的视频控制视图. 页面下半部分是用户评论列表, 能够浏览和发表评论.</li>
<li>全屏播放页面, 这个页面是直接用VideoView实现的, 另外也能将视频下载到本地.</li>
<li>"我的"页面, 从这个页面, 用户可以登录登出, 也能看到自己收藏和评论过的新闻.</li>
</ol>
<h2>二 行为型问题</h2>
<p>行为型问题主要是要考察你<strong>是否符合公司文化</strong>, 但也能表现出你其它三方面的能力. </p>
<p>在回答这种问题的时候, 要显得自信, 但又不能表现得傲慢或者有侵略性. 一个很有用的小技巧, 是在听到一个问题后不要马上回答, 让自己最少停顿三秒钟, 面试者喜欢能"先思考再回答"的程序员.</p>
<p>在回答这种问题的时候, 要有讲故事的能力, 一个具体而有趣的小故事, 好过大段干巴巴的叙述.</p>
<h3>1. 项目中最有挑战性的任务是什么?</h3>
<p>对我来说最有挑战性的任务是测试服务器的搭建.</p>
<p>因为服务器端要实现大量的流媒体处理, 工作任务重, 前期一直没有给我们可测试的接口. 我们在客户端就很难模拟真实的使用场景, 无法验证我们写的视频播放代码是否健壮, 功能是否完整.</p>
<p>因为我对流媒体处理相关的知识比较感兴趣, 就主动想办法, 通过七牛云存储的流媒体处理功能和Bomb的BAAS服务, 搭建了一个很简单的测试服务器. 在这个过程中, 我体会到了作为程序员, 不被技术所拘束, 寻找合适的工具解决具体的问题的乐趣.</p>
<h3>2. 你从项目开发过程中学到了什么?</h3>
<p>我觉得自己学到了跨部门沟通和合作的方法. 因为这个项目的客户端, 服务器端和UI设计是分包给在不同城市的三个小团队来完成, 在沟通上就有一些天然的障碍.</p>
<p>我的项目经理教我了两个技巧, 让我受益匪浅.</p>
<p>一是在别人犯错时, 交流时一定要就事论事, 对事不对人, 越具体越好. 比如, 应该说"你实现的这个功能有什么样什么样的问题", 而不能说"你有什么样什么样的问题".</p>
<p>二是在自己犯错时, 把道歉改成向别人表示感谢. 比如一次, 有一个功能联调不过, 花了很多时间最后发现是我这边的代码有一个bug, 我就写了一封邮件, 感谢服务器端的团队耐心地帮助我们解决这个问题. 效果比单纯在QQ上说"不好意思"要好多了.</p>
<h3>3. 你认为项目中最有意思的技术是什么?</h3>
<p>最有意思的Vitamio的流媒体处理技术.</p>
<p>流媒体是现在的一个热点, 今年直播技术很火爆, 流媒体处理也是视频直播的基础. 虽然这个app中, 视频相关的主要功能不是我实现的, 但通过向同事学习交流, 我也学到了很多流媒体相关的知识.</p>
<p>如果深入到较低层, 就涉及到大量的视频编解码专业知识, 流媒体协议和C/C++开发知识, 这方面也是我很欠缺的. 如果有机会, 我也很乐意在这方面能有所提升, 为我的职业发展打下更坚实的基础.</p>
<h3>4. 你遇到的最困难的bug是什么?</h3>
<p>最困难的一个bug是, 在我们把Vitamio的SDK从4.0升级到5.2之后, 一部分视频不能播放了.</p>
<p>通过对比, 我发现凡是用VideoView实现的视频, 就依然可以播放, 用MediaPlayer实现的视频就无法播放. 所以一开始我是想通过研究Vitamio VideoView的源码来解决这个问题. 但由于源码比较复杂, 花了很多时间也没有找到原因. 通过Google和StackOverflow也没有查到解决方案.</p>
<p>后来我突然想起来, 在Vitamio的Github开源库里查询其它程序员上报的issue, 发现果然有人问了这个问题, 并已经有了解决方案, 是在MediaPlayer的Info监听器中添加一句对音频流的处理. 由于这个问题的来源涉及到Vitamio的底层实现, 靠我自己的能力是不够的, 这也让我体会到, 作为程序员, 善于提问, 善于搜索, 善于利用别人的经验的重要性.</p>
<h3>5. 项目开发过程中, 你最喜欢做的工作是什么?</h3>
<p>我最喜欢做的, 是接到设计团队的高保真原型后, 自己一点点把它实现的过程. 我享受在这个过程中, 自己亲手实现一个产品带来的满足感, 我觉得这也是作为程序员最大的动力. </p>
<h3>6. 开发过程中, 如何处理和团队成员的冲突(如何处理团队中的人际关系).</h3>
<p>开发过程中发生一些冲突是难免的, 我觉得最重要的, 一是要职业化地处理这些问题, 工作上的问题在工作中解决, 不要影响自己在工作之外和别人成为朋友; 二是要能站在对方的角度思考问题, 然后两人合作, 一起把问题解决, 而不是推卸责任.</p>
<p>这个项目, 我们负责和客户对接需求的是一位产品助理, 他给我的需求经常变更, 特别是一些小的实现细节变来变去. 一开始我是比较恼火的, 后来我主动和他一起去同客户开了一次会, 我感觉到他也有他的难处, 这个客户以前没有和软件公司合作过, 不知道软件开发是怎样一个过程, 所以沟通上也比较困难.</p>
<p>我和产品助理商量后, 给出了一个解决方案. 他给我需求时, 会告诉我需求的重要性, 以及客户的这个想法是否成熟, 我会先做重要的, 稳定的需求, 其它一些零碎的小变动先不做. 这对我们确保开发进度起到了很大的帮助.</p>
<h2>技术型问题</h2>
<p>技术性问题考验你作为程序员最核心的<strong>编程能力</strong>, 但除非是直接的算法题, 这种编程能力要通过你的<strong>分析能力和沟通能力</strong>表现出来.</p>
<h3>1. 你们的项目如何分包, 有什么好处?</h3>
<p>我们的项目是按特性分包的, 每一个大的功能点放在一个包下. 这样做的好处是, 在多人开发时, 每人负责的特性其代码都放在一起, 而不用在整个代码库中跳来跳去.</p>
<p>在功能点内部, 项目结构是按MVP模式组织的, 分成视图, presenter和业务逻辑三个包. 这样便于视图和业务逻辑的解耦.</p>
<h3>2. 你们项目中用到了RxJava(或Kotlin, Dagger, Realm...等等你一点也不懂的新潮技术)吗?</h3>
<p><strong>如果你都没听说过这个单词:</strong></p>
<p>没有. 我们在做技术选型时考虑过使用RxJava, 因为RxJava最近在开发者社区中确实非常火爆, 作为程序员都很想去学习. </p>
<p>但我们发现, RxJava前期的学习曲线很陡峭, 而且一旦使用了RxJava, 整个项目的设计模式和代码结构都要做出调整, 这对于我们这种外包公司来说, 在项目维护和招人上都是一个挑战. 所以为公司考虑, 就暂时没有使用Rxjava.</p>
<p><strong>如果你听说过这个单词, 对它有一点点的了解:</strong></p>
<p>没有, 作为一个外包公司, 我们在技术选择上还是比较保守的. 但我个人对RxJava是很感兴趣的, 业余也花了一些时间学习. 我认为这种基于事件流的响应式编程模式是很好的, 是对面向对象很好的一种补充, 特别是在Android开发中, RxJava也逐渐变成了一种趋势, 替代了传统的跨线程通信和模块间交互的回调模式.</p>
<p>如果贵公司在使用RxJava, 那我应该能很快适应你们的开发环境, 因为我喜欢在对技术要求更高的环境下工作, 也有很强的学习新知识的能力.</p>
<h3>具体技术细节问题</h3>
<p>这里列举出一些典型的技术细节问题, 不提供答案. 请大家参考我们的在线课视频和文档资料来查找答案, 也可以通过百度, 知乎, CSDN等渠道查找答案.</p>
<ol>
<li>比较SurfaceView和TextureView各有什么优劣.</li>
<li>简述MediaPlayer的状态切换过程, 最好能画出其状态图.</li>
<li>如何自定义视频播放控制条?</li>
<li>如何实现视频的边下边播?</li>
<li>简述HLS技术的基本原理.</li>
<li>Android中常用的视频播放库有哪几种, 各有什么优缺点?</li>
<li>如何获取手机的本地视频?</li>
<li>如何处理视频缓冲?</li>
<li>如何获取MediaPlayer当前的状态?</li>
<li>你了解FFmpeg或Android多媒体框架吗?</li>
</ol>
</body>
</html>
<!-- This document was created with MarkdownPad, the Markdown editor for Windows (http://markdownpad.com) -->