├── .gitbook
└── assets
│ ├── 1.png
│ ├── 2.png
│ ├── 26599859.png
│ ├── 3.png
│ ├── 305188283604f96667dd4f1.97971394.png
│ ├── 4.png
│ ├── bingshan-1.png
│ └── file.excalidraw.svg
├── LICENSE
├── README.md
├── SUMMARY.md
├── cheng-wei-kai-fa-zhe
├── di-yi-ge-cheng-xu.md
└── kai-fa-zhe-de-zi-ge.md
├── cheng-wei-qiu-zhi-zhe
├── jing-li-mian-shi.md
├── qiu-zhi-yu-jian-li.md
└── xuan-ze-gong-zuo.md
├── cheng-wei-xue-sheng
├── cheng-wei-xue-sheng.md
├── li-jie-zhuan-ye-ke.md
└── xue-xiao-xue-li-yu-zhuan-ye.md
├── cheng-wei-zhi-yuan
└── kai-juan-kao-shi.md
└── xu
└── guan-yu-wo.md
/.gitbook/assets/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qdaxb/become-a-programmer/426e539afada53dbbd6735ae94ab641fca7cd525/.gitbook/assets/1.png
--------------------------------------------------------------------------------
/.gitbook/assets/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qdaxb/become-a-programmer/426e539afada53dbbd6735ae94ab641fca7cd525/.gitbook/assets/2.png
--------------------------------------------------------------------------------
/.gitbook/assets/26599859.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qdaxb/become-a-programmer/426e539afada53dbbd6735ae94ab641fca7cd525/.gitbook/assets/26599859.png
--------------------------------------------------------------------------------
/.gitbook/assets/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qdaxb/become-a-programmer/426e539afada53dbbd6735ae94ab641fca7cd525/.gitbook/assets/3.png
--------------------------------------------------------------------------------
/.gitbook/assets/305188283604f96667dd4f1.97971394.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qdaxb/become-a-programmer/426e539afada53dbbd6735ae94ab641fca7cd525/.gitbook/assets/305188283604f96667dd4f1.97971394.png
--------------------------------------------------------------------------------
/.gitbook/assets/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qdaxb/become-a-programmer/426e539afada53dbbd6735ae94ab641fca7cd525/.gitbook/assets/4.png
--------------------------------------------------------------------------------
/.gitbook/assets/bingshan-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qdaxb/become-a-programmer/426e539afada53dbbd6735ae94ab641fca7cd525/.gitbook/assets/bingshan-1.png
--------------------------------------------------------------------------------
/.gitbook/assets/file.excalidraw.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 3, 29 June 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
5 | Everyone is permitted to copy and distribute verbatim copies
6 | of this license document, but changing it is not allowed.
7 |
8 | Preamble
9 |
10 | The GNU General Public License is a free, copyleft license for
11 | software and other kinds of works.
12 |
13 | The licenses for most software and other practical works are designed
14 | to take away your freedom to share and change the works. By contrast,
15 | the GNU General Public License is intended to guarantee your freedom to
16 | share and change all versions of a program--to make sure it remains free
17 | software for all its users. We, the Free Software Foundation, use the
18 | GNU General Public License for most of our software; it applies also to
19 | any other work released this way by its authors. You can apply it to
20 | your programs, too.
21 |
22 | When we speak of free software, we are referring to freedom, not
23 | price. Our General Public Licenses are designed to make sure that you
24 | have the freedom to distribute copies of free software (and charge for
25 | them if you wish), that you receive source code or can get it if you
26 | want it, that you can change the software or use pieces of it in new
27 | free programs, and that you know you can do these things.
28 |
29 | To protect your rights, we need to prevent others from denying you
30 | these rights or asking you to surrender the rights. Therefore, you have
31 | certain responsibilities if you distribute copies of the software, or if
32 | you modify it: responsibilities to respect the freedom of others.
33 |
34 | For example, if you distribute copies of such a program, whether
35 | gratis or for a fee, you must pass on to the recipients the same
36 | freedoms that you received. You must make sure that they, too, receive
37 | or can get the source code. And you must show them these terms so they
38 | know their rights.
39 |
40 | Developers that use the GNU GPL protect your rights with two steps:
41 | (1) assert copyright on the software, and (2) offer you this License
42 | giving you legal permission to copy, distribute and/or modify it.
43 |
44 | For the developers' and authors' protection, the GPL clearly explains
45 | that there is no warranty for this free software. For both users' and
46 | authors' sake, the GPL requires that modified versions be marked as
47 | changed, so that their problems will not be attributed erroneously to
48 | authors of previous versions.
49 |
50 | Some devices are designed to deny users access to install or run
51 | modified versions of the software inside them, although the manufacturer
52 | can do so. This is fundamentally incompatible with the aim of
53 | protecting users' freedom to change the software. The systematic
54 | pattern of such abuse occurs in the area of products for individuals to
55 | use, which is precisely where it is most unacceptable. Therefore, we
56 | have designed this version of the GPL to prohibit the practice for those
57 | products. If such problems arise substantially in other domains, we
58 | stand ready to extend this provision to those domains in future versions
59 | of the GPL, as needed to protect the freedom of users.
60 |
61 | Finally, every program is threatened constantly by software patents.
62 | States should not allow patents to restrict development and use of
63 | software on general-purpose computers, but in those that do, we wish to
64 | avoid the special danger that patents applied to a free program could
65 | make it effectively proprietary. To prevent this, the GPL assures that
66 | patents cannot be used to render the program non-free.
67 |
68 | The precise terms and conditions for copying, distribution and
69 | modification follow.
70 |
71 | TERMS AND CONDITIONS
72 |
73 | 0. Definitions.
74 |
75 | "This License" refers to version 3 of the GNU General Public License.
76 |
77 | "Copyright" also means copyright-like laws that apply to other kinds of
78 | works, such as semiconductor masks.
79 |
80 | "The Program" refers to any copyrightable work licensed under this
81 | License. Each licensee is addressed as "you". "Licensees" and
82 | "recipients" may be individuals or organizations.
83 |
84 | To "modify" a work means to copy from or adapt all or part of the work
85 | in a fashion requiring copyright permission, other than the making of an
86 | exact copy. The resulting work is called a "modified version" of the
87 | earlier work or a work "based on" the earlier work.
88 |
89 | A "covered work" means either the unmodified Program or a work based
90 | on the Program.
91 |
92 | To "propagate" a work means to do anything with it that, without
93 | permission, would make you directly or secondarily liable for
94 | infringement under applicable copyright law, except executing it on a
95 | computer or modifying a private copy. Propagation includes copying,
96 | distribution (with or without modification), making available to the
97 | public, and in some countries other activities as well.
98 |
99 | To "convey" a work means any kind of propagation that enables other
100 | parties to make or receive copies. Mere interaction with a user through
101 | a computer network, with no transfer of a copy, is not conveying.
102 |
103 | An interactive user interface displays "Appropriate Legal Notices"
104 | to the extent that it includes a convenient and prominently visible
105 | feature that (1) displays an appropriate copyright notice, and (2)
106 | tells the user that there is no warranty for the work (except to the
107 | extent that warranties are provided), that licensees may convey the
108 | work under this License, and how to view a copy of this License. If
109 | the interface presents a list of user commands or options, such as a
110 | menu, a prominent item in the list meets this criterion.
111 |
112 | 1. Source Code.
113 |
114 | The "source code" for a work means the preferred form of the work
115 | for making modifications to it. "Object code" means any non-source
116 | form of a work.
117 |
118 | A "Standard Interface" means an interface that either is an official
119 | standard defined by a recognized standards body, or, in the case of
120 | interfaces specified for a particular programming language, one that
121 | is widely used among developers working in that language.
122 |
123 | The "System Libraries" of an executable work include anything, other
124 | than the work as a whole, that (a) is included in the normal form of
125 | packaging a Major Component, but which is not part of that Major
126 | Component, and (b) serves only to enable use of the work with that
127 | Major Component, or to implement a Standard Interface for which an
128 | implementation is available to the public in source code form. A
129 | "Major Component", in this context, means a major essential component
130 | (kernel, window system, and so on) of the specific operating system
131 | (if any) on which the executable work runs, or a compiler used to
132 | produce the work, or an object code interpreter used to run it.
133 |
134 | The "Corresponding Source" for a work in object code form means all
135 | the source code needed to generate, install, and (for an executable
136 | work) run the object code and to modify the work, including scripts to
137 | control those activities. However, it does not include the work's
138 | System Libraries, or general-purpose tools or generally available free
139 | programs which are used unmodified in performing those activities but
140 | which are not part of the work. For example, Corresponding Source
141 | includes interface definition files associated with source files for
142 | the work, and the source code for shared libraries and dynamically
143 | linked subprograms that the work is specifically designed to require,
144 | such as by intimate data communication or control flow between those
145 | subprograms and other parts of the work.
146 |
147 | The Corresponding Source need not include anything that users
148 | can regenerate automatically from other parts of the Corresponding
149 | Source.
150 |
151 | The Corresponding Source for a work in source code form is that
152 | same work.
153 |
154 | 2. Basic Permissions.
155 |
156 | All rights granted under this License are granted for the term of
157 | copyright on the Program, and are irrevocable provided the stated
158 | conditions are met. This License explicitly affirms your unlimited
159 | permission to run the unmodified Program. The output from running a
160 | covered work is covered by this License only if the output, given its
161 | content, constitutes a covered work. This License acknowledges your
162 | rights of fair use or other equivalent, as provided by copyright law.
163 |
164 | You may make, run and propagate covered works that you do not
165 | convey, without conditions so long as your license otherwise remains
166 | in force. You may convey covered works to others for the sole purpose
167 | of having them make modifications exclusively for you, or provide you
168 | with facilities for running those works, provided that you comply with
169 | the terms of this License in conveying all material for which you do
170 | not control copyright. Those thus making or running the covered works
171 | for you must do so exclusively on your behalf, under your direction
172 | and control, on terms that prohibit them from making any copies of
173 | your copyrighted material outside their relationship with you.
174 |
175 | Conveying under any other circumstances is permitted solely under
176 | the conditions stated below. Sublicensing is not allowed; section 10
177 | makes it unnecessary.
178 |
179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180 |
181 | No covered work shall be deemed part of an effective technological
182 | measure under any applicable law fulfilling obligations under article
183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184 | similar laws prohibiting or restricting circumvention of such
185 | measures.
186 |
187 | When you convey a covered work, you waive any legal power to forbid
188 | circumvention of technological measures to the extent such circumvention
189 | is effected by exercising rights under this License with respect to
190 | the covered work, and you disclaim any intention to limit operation or
191 | modification of the work as a means of enforcing, against the work's
192 | users, your or third parties' legal rights to forbid circumvention of
193 | technological measures.
194 |
195 | 4. Conveying Verbatim Copies.
196 |
197 | You may convey verbatim copies of the Program's source code as you
198 | receive it, in any medium, provided that you conspicuously and
199 | appropriately publish on each copy an appropriate copyright notice;
200 | keep intact all notices stating that this License and any
201 | non-permissive terms added in accord with section 7 apply to the code;
202 | keep intact all notices of the absence of any warranty; and give all
203 | recipients a copy of this License along with the Program.
204 |
205 | You may charge any price or no price for each copy that you convey,
206 | and you may offer support or warranty protection for a fee.
207 |
208 | 5. Conveying Modified Source Versions.
209 |
210 | You may convey a work based on the Program, or the modifications to
211 | produce it from the Program, in the form of source code under the
212 | terms of section 4, provided that you also meet all of these conditions:
213 |
214 | a) The work must carry prominent notices stating that you modified
215 | it, and giving a relevant date.
216 |
217 | b) The work must carry prominent notices stating that it is
218 | released under this License and any conditions added under section
219 | 7. This requirement modifies the requirement in section 4 to
220 | "keep intact all notices".
221 |
222 | c) You must license the entire work, as a whole, under this
223 | License to anyone who comes into possession of a copy. This
224 | License will therefore apply, along with any applicable section 7
225 | additional terms, to the whole of the work, and all its parts,
226 | regardless of how they are packaged. This License gives no
227 | permission to license the work in any other way, but it does not
228 | invalidate such permission if you have separately received it.
229 |
230 | d) If the work has interactive user interfaces, each must display
231 | Appropriate Legal Notices; however, if the Program has interactive
232 | interfaces that do not display Appropriate Legal Notices, your
233 | work need not make them do so.
234 |
235 | A compilation of a covered work with other separate and independent
236 | works, which are not by their nature extensions of the covered work,
237 | and which are not combined with it such as to form a larger program,
238 | in or on a volume of a storage or distribution medium, is called an
239 | "aggregate" if the compilation and its resulting copyright are not
240 | used to limit the access or legal rights of the compilation's users
241 | beyond what the individual works permit. Inclusion of a covered work
242 | in an aggregate does not cause this License to apply to the other
243 | parts of the aggregate.
244 |
245 | 6. Conveying Non-Source Forms.
246 |
247 | You may convey a covered work in object code form under the terms
248 | of sections 4 and 5, provided that you also convey the
249 | machine-readable Corresponding Source under the terms of this License,
250 | in one of these ways:
251 |
252 | a) Convey the object code in, or embodied in, a physical product
253 | (including a physical distribution medium), accompanied by the
254 | Corresponding Source fixed on a durable physical medium
255 | customarily used for software interchange.
256 |
257 | b) Convey the object code in, or embodied in, a physical product
258 | (including a physical distribution medium), accompanied by a
259 | written offer, valid for at least three years and valid for as
260 | long as you offer spare parts or customer support for that product
261 | model, to give anyone who possesses the object code either (1) a
262 | copy of the Corresponding Source for all the software in the
263 | product that is covered by this License, on a durable physical
264 | medium customarily used for software interchange, for a price no
265 | more than your reasonable cost of physically performing this
266 | conveying of source, or (2) access to copy the
267 | Corresponding Source from a network server at no charge.
268 |
269 | c) Convey individual copies of the object code with a copy of the
270 | written offer to provide the Corresponding Source. This
271 | alternative is allowed only occasionally and noncommercially, and
272 | only if you received the object code with such an offer, in accord
273 | with subsection 6b.
274 |
275 | d) Convey the object code by offering access from a designated
276 | place (gratis or for a charge), and offer equivalent access to the
277 | Corresponding Source in the same way through the same place at no
278 | further charge. You need not require recipients to copy the
279 | Corresponding Source along with the object code. If the place to
280 | copy the object code is a network server, the Corresponding Source
281 | may be on a different server (operated by you or a third party)
282 | that supports equivalent copying facilities, provided you maintain
283 | clear directions next to the object code saying where to find the
284 | Corresponding Source. Regardless of what server hosts the
285 | Corresponding Source, you remain obligated to ensure that it is
286 | available for as long as needed to satisfy these requirements.
287 |
288 | e) Convey the object code using peer-to-peer transmission, provided
289 | you inform other peers where the object code and Corresponding
290 | Source of the work are being offered to the general public at no
291 | charge under subsection 6d.
292 |
293 | A separable portion of the object code, whose source code is excluded
294 | from the Corresponding Source as a System Library, need not be
295 | included in conveying the object code work.
296 |
297 | A "User Product" is either (1) a "consumer product", which means any
298 | tangible personal property which is normally used for personal, family,
299 | or household purposes, or (2) anything designed or sold for incorporation
300 | into a dwelling. In determining whether a product is a consumer product,
301 | doubtful cases shall be resolved in favor of coverage. For a particular
302 | product received by a particular user, "normally used" refers to a
303 | typical or common use of that class of product, regardless of the status
304 | of the particular user or of the way in which the particular user
305 | actually uses, or expects or is expected to use, the product. A product
306 | is a consumer product regardless of whether the product has substantial
307 | commercial, industrial or non-consumer uses, unless such uses represent
308 | the only significant mode of use of the product.
309 |
310 | "Installation Information" for a User Product means any methods,
311 | procedures, authorization keys, or other information required to install
312 | and execute modified versions of a covered work in that User Product from
313 | a modified version of its Corresponding Source. The information must
314 | suffice to ensure that the continued functioning of the modified object
315 | code is in no case prevented or interfered with solely because
316 | modification has been made.
317 |
318 | If you convey an object code work under this section in, or with, or
319 | specifically for use in, a User Product, and the conveying occurs as
320 | part of a transaction in which the right of possession and use of the
321 | User Product is transferred to the recipient in perpetuity or for a
322 | fixed term (regardless of how the transaction is characterized), the
323 | Corresponding Source conveyed under this section must be accompanied
324 | by the Installation Information. But this requirement does not apply
325 | if neither you nor any third party retains the ability to install
326 | modified object code on the User Product (for example, the work has
327 | been installed in ROM).
328 |
329 | The requirement to provide Installation Information does not include a
330 | requirement to continue to provide support service, warranty, or updates
331 | for a work that has been modified or installed by the recipient, or for
332 | the User Product in which it has been modified or installed. Access to a
333 | network may be denied when the modification itself materially and
334 | adversely affects the operation of the network or violates the rules and
335 | protocols for communication across the network.
336 |
337 | Corresponding Source conveyed, and Installation Information provided,
338 | in accord with this section must be in a format that is publicly
339 | documented (and with an implementation available to the public in
340 | source code form), and must require no special password or key for
341 | unpacking, reading or copying.
342 |
343 | 7. Additional Terms.
344 |
345 | "Additional permissions" are terms that supplement the terms of this
346 | License by making exceptions from one or more of its conditions.
347 | Additional permissions that are applicable to the entire Program shall
348 | be treated as though they were included in this License, to the extent
349 | that they are valid under applicable law. If additional permissions
350 | apply only to part of the Program, that part may be used separately
351 | under those permissions, but the entire Program remains governed by
352 | this License without regard to the additional permissions.
353 |
354 | When you convey a copy of a covered work, you may at your option
355 | remove any additional permissions from that copy, or from any part of
356 | it. (Additional permissions may be written to require their own
357 | removal in certain cases when you modify the work.) You may place
358 | additional permissions on material, added by you to a covered work,
359 | for which you have or can give appropriate copyright permission.
360 |
361 | Notwithstanding any other provision of this License, for material you
362 | add to a covered work, you may (if authorized by the copyright holders of
363 | that material) supplement the terms of this License with terms:
364 |
365 | a) Disclaiming warranty or limiting liability differently from the
366 | terms of sections 15 and 16 of this License; or
367 |
368 | b) Requiring preservation of specified reasonable legal notices or
369 | author attributions in that material or in the Appropriate Legal
370 | Notices displayed by works containing it; or
371 |
372 | c) Prohibiting misrepresentation of the origin of that material, or
373 | requiring that modified versions of such material be marked in
374 | reasonable ways as different from the original version; or
375 |
376 | d) Limiting the use for publicity purposes of names of licensors or
377 | authors of the material; or
378 |
379 | e) Declining to grant rights under trademark law for use of some
380 | trade names, trademarks, or service marks; or
381 |
382 | f) Requiring indemnification of licensors and authors of that
383 | material by anyone who conveys the material (or modified versions of
384 | it) with contractual assumptions of liability to the recipient, for
385 | any liability that these contractual assumptions directly impose on
386 | those licensors and authors.
387 |
388 | All other non-permissive additional terms are considered "further
389 | restrictions" within the meaning of section 10. If the Program as you
390 | received it, or any part of it, contains a notice stating that it is
391 | governed by this License along with a term that is a further
392 | restriction, you may remove that term. If a license document contains
393 | a further restriction but permits relicensing or conveying under this
394 | License, you may add to a covered work material governed by the terms
395 | of that license document, provided that the further restriction does
396 | not survive such relicensing or conveying.
397 |
398 | If you add terms to a covered work in accord with this section, you
399 | must place, in the relevant source files, a statement of the
400 | additional terms that apply to those files, or a notice indicating
401 | where to find the applicable terms.
402 |
403 | Additional terms, permissive or non-permissive, may be stated in the
404 | form of a separately written license, or stated as exceptions;
405 | the above requirements apply either way.
406 |
407 | 8. Termination.
408 |
409 | You may not propagate or modify a covered work except as expressly
410 | provided under this License. Any attempt otherwise to propagate or
411 | modify it is void, and will automatically terminate your rights under
412 | this License (including any patent licenses granted under the third
413 | paragraph of section 11).
414 |
415 | However, if you cease all violation of this License, then your
416 | license from a particular copyright holder is reinstated (a)
417 | provisionally, unless and until the copyright holder explicitly and
418 | finally terminates your license, and (b) permanently, if the copyright
419 | holder fails to notify you of the violation by some reasonable means
420 | prior to 60 days after the cessation.
421 |
422 | Moreover, your license from a particular copyright holder is
423 | reinstated permanently if the copyright holder notifies you of the
424 | violation by some reasonable means, this is the first time you have
425 | received notice of violation of this License (for any work) from that
426 | copyright holder, and you cure the violation prior to 30 days after
427 | your receipt of the notice.
428 |
429 | Termination of your rights under this section does not terminate the
430 | licenses of parties who have received copies or rights from you under
431 | this License. If your rights have been terminated and not permanently
432 | reinstated, you do not qualify to receive new licenses for the same
433 | material under section 10.
434 |
435 | 9. Acceptance Not Required for Having Copies.
436 |
437 | You are not required to accept this License in order to receive or
438 | run a copy of the Program. Ancillary propagation of a covered work
439 | occurring solely as a consequence of using peer-to-peer transmission
440 | to receive a copy likewise does not require acceptance. However,
441 | nothing other than this License grants you permission to propagate or
442 | modify any covered work. These actions infringe copyright if you do
443 | not accept this License. Therefore, by modifying or propagating a
444 | covered work, you indicate your acceptance of this License to do so.
445 |
446 | 10. Automatic Licensing of Downstream Recipients.
447 |
448 | Each time you convey a covered work, the recipient automatically
449 | receives a license from the original licensors, to run, modify and
450 | propagate that work, subject to this License. You are not responsible
451 | for enforcing compliance by third parties with this License.
452 |
453 | An "entity transaction" is a transaction transferring control of an
454 | organization, or substantially all assets of one, or subdividing an
455 | organization, or merging organizations. If propagation of a covered
456 | work results from an entity transaction, each party to that
457 | transaction who receives a copy of the work also receives whatever
458 | licenses to the work the party's predecessor in interest had or could
459 | give under the previous paragraph, plus a right to possession of the
460 | Corresponding Source of the work from the predecessor in interest, if
461 | the predecessor has it or can get it with reasonable efforts.
462 |
463 | You may not impose any further restrictions on the exercise of the
464 | rights granted or affirmed under this License. For example, you may
465 | not impose a license fee, royalty, or other charge for exercise of
466 | rights granted under this License, and you may not initiate litigation
467 | (including a cross-claim or counterclaim in a lawsuit) alleging that
468 | any patent claim is infringed by making, using, selling, offering for
469 | sale, or importing the Program or any portion of it.
470 |
471 | 11. Patents.
472 |
473 | A "contributor" is a copyright holder who authorizes use under this
474 | License of the Program or a work on which the Program is based. The
475 | work thus licensed is called the contributor's "contributor version".
476 |
477 | A contributor's "essential patent claims" are all patent claims
478 | owned or controlled by the contributor, whether already acquired or
479 | hereafter acquired, that would be infringed by some manner, permitted
480 | by this License, of making, using, or selling its contributor version,
481 | but do not include claims that would be infringed only as a
482 | consequence of further modification of the contributor version. For
483 | purposes of this definition, "control" includes the right to grant
484 | patent sublicenses in a manner consistent with the requirements of
485 | this License.
486 |
487 | Each contributor grants you a non-exclusive, worldwide, royalty-free
488 | patent license under the contributor's essential patent claims, to
489 | make, use, sell, offer for sale, import and otherwise run, modify and
490 | propagate the contents of its contributor version.
491 |
492 | In the following three paragraphs, a "patent license" is any express
493 | agreement or commitment, however denominated, not to enforce a patent
494 | (such as an express permission to practice a patent or covenant not to
495 | sue for patent infringement). To "grant" such a patent license to a
496 | party means to make such an agreement or commitment not to enforce a
497 | patent against the party.
498 |
499 | If you convey a covered work, knowingly relying on a patent license,
500 | and the Corresponding Source of the work is not available for anyone
501 | to copy, free of charge and under the terms of this License, through a
502 | publicly available network server or other readily accessible means,
503 | then you must either (1) cause the Corresponding Source to be so
504 | available, or (2) arrange to deprive yourself of the benefit of the
505 | patent license for this particular work, or (3) arrange, in a manner
506 | consistent with the requirements of this License, to extend the patent
507 | license to downstream recipients. "Knowingly relying" means you have
508 | actual knowledge that, but for the patent license, your conveying the
509 | covered work in a country, or your recipient's use of the covered work
510 | in a country, would infringe one or more identifiable patents in that
511 | country that you have reason to believe are valid.
512 |
513 | If, pursuant to or in connection with a single transaction or
514 | arrangement, you convey, or propagate by procuring conveyance of, a
515 | covered work, and grant a patent license to some of the parties
516 | receiving the covered work authorizing them to use, propagate, modify
517 | or convey a specific copy of the covered work, then the patent license
518 | you grant is automatically extended to all recipients of the covered
519 | work and works based on it.
520 |
521 | A patent license is "discriminatory" if it does not include within
522 | the scope of its coverage, prohibits the exercise of, or is
523 | conditioned on the non-exercise of one or more of the rights that are
524 | specifically granted under this License. You may not convey a covered
525 | work if you are a party to an arrangement with a third party that is
526 | in the business of distributing software, under which you make payment
527 | to the third party based on the extent of your activity of conveying
528 | the work, and under which the third party grants, to any of the
529 | parties who would receive the covered work from you, a discriminatory
530 | patent license (a) in connection with copies of the covered work
531 | conveyed by you (or copies made from those copies), or (b) primarily
532 | for and in connection with specific products or compilations that
533 | contain the covered work, unless you entered into that arrangement,
534 | or that patent license was granted, prior to 28 March 2007.
535 |
536 | Nothing in this License shall be construed as excluding or limiting
537 | any implied license or other defenses to infringement that may
538 | otherwise be available to you under applicable patent law.
539 |
540 | 12. No Surrender of Others' Freedom.
541 |
542 | If conditions are imposed on you (whether by court order, agreement or
543 | otherwise) that contradict the conditions of this License, they do not
544 | excuse you from the conditions of this License. If you cannot convey a
545 | covered work so as to satisfy simultaneously your obligations under this
546 | License and any other pertinent obligations, then as a consequence you may
547 | not convey it at all. For example, if you agree to terms that obligate you
548 | to collect a royalty for further conveying from those to whom you convey
549 | the Program, the only way you could satisfy both those terms and this
550 | License would be to refrain entirely from conveying the Program.
551 |
552 | 13. Use with the GNU Affero General Public License.
553 |
554 | Notwithstanding any other provision of this License, you have
555 | permission to link or combine any covered work with a work licensed
556 | under version 3 of the GNU Affero General Public License into a single
557 | combined work, and to convey the resulting work. The terms of this
558 | License will continue to apply to the part which is the covered work,
559 | but the special requirements of the GNU Affero General Public License,
560 | section 13, concerning interaction through a network will apply to the
561 | combination as such.
562 |
563 | 14. Revised Versions of this License.
564 |
565 | The Free Software Foundation may publish revised and/or new versions of
566 | the GNU General Public License from time to time. Such new versions will
567 | be similar in spirit to the present version, but may differ in detail to
568 | address new problems or concerns.
569 |
570 | Each version is given a distinguishing version number. If the
571 | Program specifies that a certain numbered version of the GNU General
572 | Public License "or any later version" applies to it, you have the
573 | option of following the terms and conditions either of that numbered
574 | version or of any later version published by the Free Software
575 | Foundation. If the Program does not specify a version number of the
576 | GNU General Public License, you may choose any version ever published
577 | by the Free Software Foundation.
578 |
579 | If the Program specifies that a proxy can decide which future
580 | versions of the GNU General Public License can be used, that proxy's
581 | public statement of acceptance of a version permanently authorizes you
582 | to choose that version for the Program.
583 |
584 | Later license versions may give you additional or different
585 | permissions. However, no additional obligations are imposed on any
586 | author or copyright holder as a result of your choosing to follow a
587 | later version.
588 |
589 | 15. Disclaimer of Warranty.
590 |
591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599 |
600 | 16. Limitation of Liability.
601 |
602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610 | SUCH DAMAGES.
611 |
612 | 17. Interpretation of Sections 15 and 16.
613 |
614 | If the disclaimer of warranty and limitation of liability provided
615 | above cannot be given local legal effect according to their terms,
616 | reviewing courts shall apply local law that most closely approximates
617 | an absolute waiver of all civil liability in connection with the
618 | Program, unless a warranty or assumption of liability accompanies a
619 | copy of the Program in return for a fee.
620 |
621 | END OF TERMS AND CONDITIONS
622 |
623 | How to Apply These Terms to Your New Programs
624 |
625 | If you develop a new program, and you want it to be of the greatest
626 | possible use to the public, the best way to achieve this is to make it
627 | free software which everyone can redistribute and change under these terms.
628 |
629 | To do so, attach the following notices to the program. It is safest
630 | to attach them to the start of each source file to most effectively
631 | state the exclusion of warranty; and each file should have at least
632 | the "copyright" line and a pointer to where the full notice is found.
633 |
634 |
635 | Copyright (C)
636 |
637 | This program is free software: you can redistribute it and/or modify
638 | it under the terms of the GNU General Public License as published by
639 | the Free Software Foundation, either version 3 of the License, or
640 | (at your option) any later version.
641 |
642 | This program is distributed in the hope that it will be useful,
643 | but WITHOUT ANY WARRANTY; without even the implied warranty of
644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645 | GNU General Public License for more details.
646 |
647 | You should have received a copy of the GNU General Public License
648 | along with this program. If not, see .
649 |
650 | Also add information on how to contact you by electronic and paper mail.
651 |
652 | If the program does terminal interaction, make it output a short
653 | notice like this when it starts in an interactive mode:
654 |
655 | Copyright (C)
656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657 | This is free software, and you are welcome to redistribute it
658 | under certain conditions; type `show c' for details.
659 |
660 | The hypothetical commands `show w' and `show c' should show the appropriate
661 | parts of the General Public License. Of course, your program's commands
662 | might be different; for a GUI interface, you would use an "about box".
663 |
664 | You should also get your employer (if you work as a programmer) or school,
665 | if any, to sign a "copyright disclaimer" for the program, if necessary.
666 | For more information on this, and how to apply and follow the GNU GPL, see
667 | .
668 |
669 | The GNU General Public License does not permit incorporating your program
670 | into proprietary programs. If your program is a subroutine library, you
671 | may consider it more useful to permit linking proprietary applications with
672 | the library. If this is what you want to do, use the GNU Lesser General
673 | Public License instead of this License. But first, please read
674 | .
675 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # 介绍
2 |
3 | 这些年在微博上回答和总结了不少关于程序员工作方面的问题,也获得了一些朋友的认可。随着总结内容的不断增多,有个疑惑在我心中逐渐增长:为什么这些事情之前没人告诉我?
4 |
5 | 后来我发现,虽然每个具体问题最终都能找到完整的、可参考的资料,但是这些问题并不能简单的归类为一个具体的类别,而是在程序员职业发展的过程中逐渐显现的,包含了各种类型的,难以被简单总结和归纳的一系列问题的合集。
6 |
7 | 在程序员成长过程中,每个阶段都会被赋予不同的角色,这些角色之间虽然有联系,也会有区别。例如,一个开发能力非常强的程序员,在他负责一个大型项目的时候,一部分精力实际上变为了管理者的角色;或者,当他去推广某个组件时,实际的角色是布道师。
8 |
9 | 大多数书籍或者文章都会专注在某个角色(比如“java开发者”)之上,而当角色发生转变,尤其是隐性转变的时候,就会发现过往的很多知识和技巧突然就不再适用了。程序员很容易发现不同编程语言和技术栈之间的区别,但是却往往容易忽视不同角色之间的技能鸿沟,很多时候,不同角色之间的区别会被淡化,最终会被归结于“人的能力”。但是假如能以新角色的视角审视问题,就会发现绝大部分的问题实际上都是简单到不能再简单的基础问题,之所以不断踩坑,只是因为自己没有察觉到角色已经发生改变了。
10 |
11 | 这促使我想做点什么,能够帮助自己和更多的程序员们避免在这些简单问题上持续的踩坑,因此就有了这本书。我希望能总结出程序员成长发展过程中面临的不同角色,以及作为这个角色,应该具备的基本知识和能力。
12 |
13 | 写下这篇介绍的时候,《成为程序员》这本书里还没有什么具体内容。按照我一贯的想法,我希望最终呈现的是一些有点意思,同时也能让人有点收获的东西,而不是完全的知识输出。这本书大概会以我自己的成长经历为基础,识别和总结出不同阶段的角色,再给出这个角色应该具备的基础能力和后续发展方向。
14 |
15 | 我希望它最终能够成为程序员职业发展的某种“索引”,本身不需要过多的篇幅,但是能够给人足够清晰的脉络。
16 |
17 | 本书的在线阅读地址为:[https://become-a-programmer.2baxb.me](https://become-a-programmer.2baxb.me) ,由于个人的能力和视野有限,书中内容难免出现主观或客观错误,希望大家不吝指正。
18 |
19 | 同时由于精力有限,这本书目前采取不定期更新的方式编写,源码会在[https://github.com/qdaxb/become-a-programmer](https://github.com/qdaxb/become-a-programmer)同步,根据反馈来决定后续更新的频率,如果你觉着内容还不错,欢迎留下star。
20 |
21 | 让我们开始成为程序员吧。
22 |
--------------------------------------------------------------------------------
/SUMMARY.md:
--------------------------------------------------------------------------------
1 | # Table of contents
2 |
3 | ## 序
4 |
5 | * [介绍](README.md)
6 | * [关于我](xu/guan-yu-wo.md)
7 |
8 | ## 成为开发者
9 |
10 | * [第一个程序](cheng-wei-kai-fa-zhe/di-yi-ge-cheng-xu.md)
11 | * [开发者的资格](cheng-wei-kai-fa-zhe/kai-fa-zhe-de-zi-ge.md)
12 |
13 | ## 成为学生
14 |
15 | * [学校、学历与专业](cheng-wei-xue-sheng/xue-xiao-xue-li-yu-zhuan-ye.md)
16 | * [理解专业课](cheng-wei-xue-sheng/li-jie-zhuan-ye-ke.md)
17 | * [成为学生](cheng-wei-xue-sheng/cheng-wei-xue-sheng.md)
18 |
19 | ## 成为求职者
20 |
21 | * [求职与简历](cheng-wei-qiu-zhi-zhe/qiu-zhi-yu-jian-li.md)
22 | * [经历面试](cheng-wei-qiu-zhi-zhe/jing-li-mian-shi.md)
23 | * [选择工作](cheng-wei-qiu-zhi-zhe/xuan-ze-gong-zuo.md)
24 |
25 | ## 成为职员
26 |
27 | * [开卷考试](cheng-wei-zhi-yuan/kai-juan-kao-shi.md)
28 |
--------------------------------------------------------------------------------
/cheng-wei-kai-fa-zhe/di-yi-ge-cheng-xu.md:
--------------------------------------------------------------------------------
1 | # 第一个程序
2 |
3 | 新书开始的第一章,本来想以“为什么我想成为程序员”的契机入手,写点什么有趣或者让人吃惊的故事。
4 |
5 | 结果却反而让我吃了一惊:无论我怎么回忆,都想不起来那个“想要成为程序员”的瞬间了,似乎“成为程序员”这个想法是我与生俱来的,跟吃饭喝水一样的本能。
6 |
7 | 不过我倒是能回忆起来自己成为开发者的时刻:小学的时候我就接触了电脑,并且接触到了一个叫做《万王之王》的网络游戏,那些年的网游都有一个特点,就是前期铺垫很足,但是显然没怎么考虑后期要让玩家干什么,《万王之王》也是如此。
8 |
9 | 升到满级之后,为了让玩家有点事做,它加入了一种“额外点数”的机制,玩家满级之后,再7\*24小时的打上十天半个月的怪物,就能获得一个额外的技能点数,额外的点数越多,自然也就越强。
10 |
11 | 即使再沉迷游戏,也很难有人类能够完成如此枯燥又永无止境的工作,于是各种游戏外挂应运而生,其中有一款叫做zkok的外挂佼佼者,它有两个特点:
12 |
13 | 一是这个外挂可以脱离游戏客户端直接单独运行,也就意味着外挂可以跳过UI,直接操作玩家的一切行为;
14 |
15 | 另一个是,它自创了一套脚本语言,所有人都可以通过脚本语言来控制自己角色的行为,某种程度上来说,脚本语言就像是在为自己角色“注入灵魂”。
16 |
17 | 如今网络上还能搜到一些曾经的zkok的脚本:
18 |
19 | ```
20 | %scene time_blink
21 | 30:time_blink_bc:time_blink
22 | :pop next
23 |
24 | %scene begin
25 | 30:retime_bc:cast retime on
26 | 30:time_break_bc:cast time_break on woman
27 |
28 | %scene soul_steal
29 | 30:soul_steal_bc:cast soul_steal on %(0,2)
30 | 30:soul_steal_bc:cast soul_steal on %(0,3)
31 | 30:soul_steal_bc:cast demon_strike on
32 | :pop next
33 | %bc retime_bc
34 | retry:0.5:但是什麽也没发生。
35 | next::回时术的力量%*
36 | call:time_blink:你低头凝神%*
37 | call:soul_steal:你的法力不够 !!
38 | retry:0.5:你上一个动作没有完成, 不能施法!
39 |
40 | %bc time_blink_bc
41 | retry:0.5:你才刚扰动过时空能流,时空能流还不稳定。
42 | retry:0.5:你试图扰动时空能流,但是失败了。
43 | next::你的身体突然由内向外放出光芒,以极快的速度闪了几闪。
44 | next::你现在并不忙碌。
45 |
46 | %bc time_break_bc
47 | call:soul_steal:你的法力不够 !!
48 | retry:0.5:你上一个动作没有完成, 不能施法!
49 | retry::但是什麽事也没发生。
50 | call:time_blink:你喃喃念道 : 梅加欧依 ~~ 泰依欧姆 ~~ 克雷格 ...
51 |
52 | %bc locate_bc
53 | next::你正忙著呢 !
54 | next::你才使用传送不久,没办法这麽快再用。
55 | next:3:你的四周突然一阵模糊不清,转眼间你就消失了。
56 |
57 | %bc soul_steal_bc
58 | call:time_blink:你在你和%*
59 | call:time_blink:你划下的六芒星突然发出黑暗的幽光 ...
60 | retry:0.5:但是什麽事也没发生。
61 | retry:0.5:你上一个动作没有完成, 不能施法!
62 | next:你得到 %* 点经验。)
63 | next::你的法力不够 !!
64 | next::那里没有任何人。
65 | next::你现在不在战斗中。
66 | ```
67 |
68 | 深入一点学习的话,还能发现条件、循环、跳转、函数定义和调用之类的语法,即使从今天的视角看,这种语言也可以称得上是某种“程序”。
69 |
70 | 于是我为了玩游戏能更好的挂机,成为了开发者。
71 |
72 | 我写的第一个让自己非常满意的程序,应该是实现了一个游戏里的“自动问答机器人”:可以一边打怪练级,一边在世界频道发些城邦(类似于现在游戏里的公会)招人的广告,最重要的是,在其他人私聊我之后,可以让他们通过输入“1”、“2”、“3”之类的内容,可以触发不同的回复内容,也可以自动邀请人加入公会,甚至可以自动完成交易。
73 |
74 | 那个时候我应该小学刚毕业没多久,在完成这个程序之后,我每天所做的事情就是看着这个“机器人”有没有顺利的完成自己的工作,并对自己写出来的脚本能一次又一次的正确的实现我的意图而惊叹。
75 |
--------------------------------------------------------------------------------
/cheng-wei-kai-fa-zhe/kai-fa-zhe-de-zi-ge.md:
--------------------------------------------------------------------------------
1 | # 开发者的资格
2 |
3 | 研究zkok的挂机脚本让我痴迷了很长时间,那个年代只能拨号上网,相当于上网不单要出网费,还要收电话费,一分钟就要差不多一块钱,贵的出奇。
4 |
5 | 后来我们几个“不务正业”的年轻人找到了学校旁边新开的网吧,在角落里的一个机器里用默认的administrator账号绕开了网吧管理程序,并且在开机脚本里偷偷加载了我们的挂机程序。之后几个月里,我们的挂机程序都运行正常,直到有一天机器被网吧管理员升级了,这才结束了我写的挂机程序的无故障运行记录。
6 |
7 | 在最初的挂机脚本之后,我开始偶尔写一些不那么正式的程序。
8 |
9 | 比如在我12岁的时候,互联网的概念开始兴起,各种免费ftp网站盛行,我也跟风做了个静态的游戏网站,那时候盛行个人网站之间交换友情链接,我也厚着脸皮交换了一堆链接,然后每天看着网站计数器有什么变化,可惜最终访问量只有几万人。
10 |
11 | 15岁的时候,开始买各种电脑杂志,并且沉迷于写“把mp3里的文件按元信息批量重命名”之类的各种批处理程序。
12 |
13 | 18岁的时候,魔兽世界横空出世,我在沉迷副本的同时也对游戏里的插件系统产生了兴趣,于是又写了不少自用的插件(没错,我又用lua做了个自动聊天机器人),还因为分享各种宏命令在论坛里小有名气。
14 |
15 | 19岁的时候,架了个大学的非官方校园论坛,每天都在各种魔改discuz。
16 |
17 | 而在做这些事的时候,我还没有开始正式的学过编程,也没有上过什么专业课程。
18 |
19 | 这些年有很多人找我咨询计算机选专业或者是自己能否转行成为程序员之类的问题,在大部分人心目中,“程序员”是一个高门槛职业。但是,我想强调的是,仅仅成为开发者(而不是依靠编程养活自己)的门槛实际上相当低:
20 |
21 | * 没有太多前期投入,仅需要一台(玩游戏买来顺便用于编程的)电脑。
22 | * 没有什么安全问题,比如我在小时候对电路也非常感兴趣,直到摸了一次电门之后这个兴趣就无疾而终了。
23 | * 如今,随着程序员这个职业的发展,入门的资料也非常多,从书籍、视频到github源代码一应俱全。
24 |
25 | 因此,在成为程序员之前,不妨成为一名开发者。或者说,即使不以程序员作为职业,也不妨碍自己学会“编程”这个技术。
26 |
27 | 成为开发者并没有非常高的门槛,以至于这一章里我没有什么多余的可以凑字数的东西:仅需要一点兴趣和好奇心,就够了。
28 |
--------------------------------------------------------------------------------
/cheng-wei-qiu-zhi-zhe/jing-li-mian-shi.md:
--------------------------------------------------------------------------------
1 | # 经历面试
2 |
3 | 我没经历过非常多面试,但是大多数面试都有些让人印象深刻的经历。
4 |
5 | * 刚毕业的时候,面试一家小公司,面试官问我“会不会Java”,我说“还不会,但是可以学”,然后就面试通过了。
6 | * 第一次跳槽,面试官问我“你吃过什么苦”,我说“我没吃过什么苦”,然后面试失败了。
7 | * 第二次跳槽,一看到面试官发现他是我第一家公司的同事,然后就面试通过了。
8 | * 第三次跳槽,面试官先问我数据结构和算法,过了一会换了个人问了我C的问题,过了一会换了个人来问Java问题,过了一会又来个人问JVM问题,最终换了6个面试官,面了我7个小时。
9 | * 过了两天,我又收到第7轮面试邀请,来了之后面试官问我“你会不会安卓”,我说“还不会,但是可以学”,然后就面试失败了。
10 | * 还是第三次跳槽,又是各种车轮面试了5轮之后,过了两天让我来面试第六轮,面试官问我“你是从外地来的?”,我说是,然后就面试通过了。
11 |
12 | 从我的经历可以总结出一个粗浅的面试规律,每家公司的面试都是流程不确定的、主观性非常强的、结果也很难以预测的事情。因此,我会更多的从面试官的视角来整理面试里需要注意的问题。
13 |
14 | ## 面试内容
15 |
16 | ### 知识
17 |
18 | #### 基础知识
19 |
20 | 公司越大,对程序员基础知识的考核越严格。很多人吐槽大公司喜欢“面试造飞机入职拧螺丝”,但是我认为考核要求高的原因很好理解,就像我在前面章节里讲的,基础知识决定了发展上限,而大公司的技术上限高,因此需要招进来更多具备发展潜力的人,来避免人才梯队断档。
21 |
22 | 不同岗位要求的基础知识会有区别,但是总的来说,数据结构与算法、网络、操作系统与组成原理多少都会涉及到。
23 |
24 | 这部分内容的考核让程序员面试看起来非常的高大上,网上关于这方面内容的资料也很多,从LeetCode刷题、到书籍、到课程、到经验,该有的都有了。但是基础还是能刷掉很多人,原因也非常好理解:基础知识不那么容易掌握。
25 |
26 | 我的建议,一方面是踏实的把基础知识学好(应届生都应该都有足够的学习相关课程和练习的时间)。
27 |
28 | 另一方面是做一些针对性的练习,推荐书籍是Gayle Laakmann McDowell的《Cracking the Coding Interview: 189 Programming Questions and Solutions》
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 | 项目介绍时,很多应聘者没有使用STAR原则,而是上来就开始介绍项目使用的具体技术,甚至没有项目介绍,直接描述自己的工作。这就让面试官无法理解项目的基本信息,以至于后面会不自觉的产生“这有什么难的”的印象。
56 |
57 | 另一方面,在介绍自己工作的时候,有些应聘者没有跳出“单一角色”的思维方式,让他拧螺丝,他就埋头拧螺丝,甚至从来没有看过飞机一眼。而程序员的工作,越要深入,越会承担更多的角色(这也是编写本书的初衷),在相同的条件下,企业大概率会选择能够承担起更多角色的人。
58 |
59 | #### 领域技能
60 |
61 | 领域技能和知识的区别是,技能更偏向于解决实际问题的能力。一般在沟通项目时,会有一些随机性的提问,比如“这里出现问题你是怎么解决的”或者“有没有遇到过xx类问题”。
62 |
63 | 面试官的能力越强,能问出的问题水平也越高。领域技能更强调实践能力,应该通过一些具体的场景,逐渐泛化,过程中综合的考察面试者的知识、经验、技能等等能力,考察过程是由下到上的。
64 |
65 | 但是实际上,一部分领域技能的考察又变成了领域知识的八股文式的考察,比如问“JVM调整堆大小是什么参数”,这种就是相当低级的领域技能问题;
66 |
67 | 同样的问题,可以给出一个具体场景,比如“如果我的Java程序报OOM错误,那么有什么解决办法”,进一步可以提问“都能调整堆的哪些参数”、“这个参数是怎么解决OOM错误的”,后续还可以追问“除了调节堆大小,还有什么其他可能的解决方法”,等等。
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 | 关于具体问题的解题技巧,推荐参考上面推荐的《Cracking the Coding Interview》,但是,我更想表达的是,作为招聘方,面试更多的是希望模拟工作中的实际状态,来了解应聘者在真实场景下的反应。因此在面试过程中表现不佳的应聘者,一部分原因是因为知识、技能掌握程度不好,另一部分则是没有在日常学习、工作中养成良好的思维方式、沟通习惯和解题技巧。
94 |
95 | 当面试的人多了以后,很多面试都不需要进行到实际的知识或者技能的沟通阶段,只要听完个人简介,就基本能了解这个人是否是一个能够胜任工作的人,剩下的时间只是在验证自己推测。
96 |
97 | 因此,不要把面试当做某种考试,然后被动的回答问题,而是把面试当做一份只入职一小时的工作,把自己在实际工作中会用到的思路、技巧融入到面试过程中去,大胆的和面试官进行交流,会对面试过程有很大的帮助。
98 |
99 | #### 剩下的一些Tips
100 |
101 | * 不同的公司面试流程和地点不同,如果想带点什么东西,建议简历(没必要彩打)、纸笔、水。
102 | * 前面也讨论过,不同公司的招聘方法和侧重点相差非常大,同样是考察领域技能,有一些更偏向于“会不会”,另一些更偏向于“能不能学会”。因此,遇到不会的问题,不要直接放弃,尽力回答就好(具体如何尽力参考上面推荐的书)。这个原则在实际工作中也是一样,没有主管会喜欢遇到问题直接撂挑子的组员。
103 | * 每轮面试后会有提问环节,不要对每个人都问一样的问题。一般公司面试至少要包括团队负责人、部门负责人和人力部门三轮面试,在每轮面试完成后可以先问一下对方的岗位,向团队负责人咨询岗位的具体工作内容、向部门负责人咨询部门整体情况和未来规划、向HR负责人咨询公司政策和薪酬。
104 |
105 | 最后,还是以冰山模型作为例子,大多数的面试都只有几十分钟到数小时,在这么短的时间里,很难了解到冰山下面的每个人的天赋特质,因此,一两次的面试失败并不能意味着什么。
106 |
107 | 同时,越有吸引力的招聘岗位,越有可能对冰山下面的那些特质感兴趣。领域知识可以快速学习、解题技巧可以短期锻炼,但是真正在实践中解决问题的思路、底层知识的储备和学习工作中沉淀下来的经验是很难快速补齐,因此,面试最终的技巧始终还是“打铁还需自身硬”。
108 |
109 |
110 |
111 |
--------------------------------------------------------------------------------
/cheng-wei-qiu-zhi-zhe/qiu-zhi-yu-jian-li.md:
--------------------------------------------------------------------------------
1 | # 求职与简历
2 |
3 | 我自己的求职经历可以说是惨不忍睹。
4 |
5 | 还没毕业的时候,有一天听人说学校旁边有个计算机专场招聘会,于是我和几个小伙伴抱着凑热闹的心态,拿上简历,坐着公交车就过去了。
6 |
7 | 那时候正好是经济危机的年份,下了公交车以后我们才发现,招聘会场外排队进场的人从招聘会门口排到了下一站公交车的站牌那里。在太阳下面暴晒了一个多小时以后终于排到进场之后,发现会场里完全不是想象中的井然有序,而是燥热、嘈杂、还夹杂着一股汗臭味。
8 |
9 | 我犹豫许久,在路过的一个展台颤抖着递出了人生中第一份简历。那人甚至都没有抬头,随手把简历放在旁边一大摞纸的最上面,然后摆手让我走吧。
10 |
11 | 后面的几家公司也是同样的经历,一下午过去,甚至没有人看过我简历里写的东西。
12 |
13 | 过了几年,同样的事情又发生在我从老家跳槽到北京的那段日子里。当时裸辞之后背着个包直接来了北京,找工作的三个月的时间里除了改简历也没什么可做的。
14 |
15 | 记得当时把简历发给了很多人让他们帮忙提意见,发-被喷-改,这个过程循环了十几次,投-hr没回应-改,这个过程又循环了十几次。我内心里觉得自己无所不能,只要有面试我一定有能力通过,但恰恰就是没人给我面试机会。
16 |
17 | 这让我很长一段时间内患上了“简历恐惧症”,看到任何跟简历相关的东西都会联想到自己的这些痛苦的经历。
18 |
19 | 又过了很多年,我自己开始招聘,理解了招聘背后的工作流程之后,才逐渐放下之前关于简历的那些执念。
20 |
21 | ## 好的简历
22 |
23 | 虽然网上有非常多的关于怎么写简历的原则和心得,但是显然这部分科普工作做的还不是非常彻底,这些年我收到的奇怪的简历数不胜数:
24 |
25 | * 简历里的获奖记录:小学的时候担任思想品德课代表
26 | * 简历里的竞赛记录:参加过校园十大歌手大赛
27 | * 简历里的自我介绍:下班以后喜欢看内涵段子
28 | * 简历里的自我评价:把10季的老友记看了很多遍
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 | 强烈推荐读一下Robin Williams的《写给大家看的设计书》,并且掌握书中的四个原则:
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 | 要描述自己主动性强,最无用的方法就是在简历里写上“我的主动性强”,正确的方法应该是通过描述具体的经历,体现出你想表达出的优势,描述的内容应该符合STAR原则,即:
95 |
96 | * Situation
97 | * Task
98 | * Action
99 | * Result
100 |
101 | 关于STAR原则的内容已经一大把了,可以自行参考。还是拿上面“我的主动性强”作为例子,如果用STAR原则重写一遍,那么大概是:
102 |
103 | > 接手项目后,建立整体开发看板,通过统计开发工时,发现XX类需求较多,每次修改周期较长。之后主动对项目进行分析和重构,通过使用XX模式,支持了动态修改XX的功能,单次修改周期由X天降低至X分钟,团队整体每年可因此节约X个人日。
104 |
105 | 如果想更深入的了解关于写简历的指导,推荐阅读Gayle Laakmann McDowell写的《The Google Resume》,缺点(也可以说优点)是没有中文版。
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 |
--------------------------------------------------------------------------------
/cheng-wei-qiu-zhi-zhe/xuan-ze-gong-zuo.md:
--------------------------------------------------------------------------------
1 | # 选择工作
2 |
3 | 求职的最终目的还是找到一份合适的工作,我见过个别求职者在一个面试周期里能拿到十个以上的offer,当然这是个例,但是大部分求职者应该最终还是能拿到1-2个入职通知。
4 |
5 | 经常会有人让我帮忙比较一下两个offer哪个更好。我发现他们虽然已经通过了面试,但是对于即将要入职的这份工作却几乎没有什么了解,甚至只知道公司名,连要入职的部门都不清楚。
6 |
7 | ### 公司、部门与团队
8 |
9 | 很多应届生都问过我到底是选择大公司的普通offer,还是给的薪资更高一些的小公司,甚至是创业公司。从我的招聘经验来看,对于应届生,应该尽量选择大公司。
10 |
11 | 对于应届生来说,初始的薪资即使有差异,但是也不会差的过于离谱。但是大公司的管理体系、培训体系、业务场景是小公司不具备的。同时,入职大公司以后出现问题的风险也相对更低。在职场初期,有一个相对稳定的适应过程是很有必要的。
12 |
13 | 但是,除了关注公司之外,很多求职者并没有关注自己究竟入职的是哪个部门。但绝大部分情况下,一份工作的好坏=公司\*部门,越是大公司,就越会存在一些边缘部门。这些部门的工作食之无味、弃之可惜,缺少有挑战的场景,也难以支撑人才的培养阶梯,招人入职更多的是做一些基础性、日常性的工作。
14 |
15 | 同理,在同一个部门下也会划分很多团队,这些团队之间的区别更像是团队领导之间的区别,每个团队负责人都会有自己的一套管理风格,同一个人做同样的事情,在一些领导看来是加分项,而在另一些领导看来甚至已经踩到了红线。
16 |
17 | 而这些决定了入职之后很长一段时间工作状态的事情不会被放在岗位说明或者公司介绍里,因此,求职者需要通过沟通来确认这些信息。
18 |
19 | #### 获取公司信息
20 |
21 | 一般来说,公司的信息都可以在公开渠道搜索到,如果想了解,甚至可以了解到这家公司目前的财务状况、诉讼状况、在职人数、行业评价等等信息,这里不再过多赘述。
22 |
23 | #### 获取部门信息
24 |
25 | 类似“XX部门怎么样”这样的公司内部的信息很难通过公开检索的方式获取到,但也不意味着通过公开的渠道完全无法了解,一个最简单的判断标准:
26 |
27 | 1. 直接支撑主营业务运营的部门是核心部门。
28 | 2. 间接支撑主营业务运营,或者基于其他业务盈利的部门是相对非核心部门。
29 | 3. 跟主营业务没啥关系又不赚钱的部门是绝对非核心部门。
30 |
31 | 所以,如果在一个硬件公司里面出现了跟硬件支持完全无关的软件部门,大概率可以认为这个部门没有那么核心。
32 |
33 | 但是,很多中大规模大公司里会藏着一堆历史遗留下来的不明觉历的部门,单纯依靠部门名很难实际理解他们在做什么,因此,还可以从三类人这里打听到这类信息:部门负责人、部门内部人员、相关部门人员。
34 |
35 | 部门负责人和部门内部人员是获取这类信息效率最高的途径,因为面试过程中就会接触到他们,大部分面试流程结束后,都会象征性的让求职者提问。我强烈建议通过提问环节来了解部门的状况,大概分三个问题:
36 |
37 | 1. 部门的核心职责(KPI、OKR或者类似的考核指标)
38 | 2. 部门的大致人员规模
39 | 3. 部门的中期规划
40 |
41 | 一般来说,面试的第2-4轮面试官会是部门的负责人,可以向他了解这部分信息。
42 |
43 | 同时,也可以拿同样的问题问一下第1-2轮的面试官,看看他们的回答和部门负责人是否基本一致,可以间接的了解这个部门的组织效率是否高效。
44 |
45 | 如果可以找到相关部门人员(一般来说是内推到其他部门的情况),也可以从作为另一个获取数据的渠道。但是跨部门的信息一般会失真,所以可以多问问“跟他们部门的人配合起来是否高效”这种评价性的问题。
46 |
47 | #### 获取团队信息
48 |
49 | 一般来说,第1-2轮的面试官会是团队负责人。相对于部门信息,团队信息(或者说团队负责人的信息)的获取要更难一些,因为这其中掺杂了更多的“人”的因素,就像面试官很难快速而准确的筛选候选人一样(这个后面会讲到),候选人也很难筛选作为面试官团队负责人。
50 |
51 | 但是也还是有一些效率比较高的问题可以做一些基础的判断,包括:
52 |
53 | 1. 团队的规模是多少,去年有多少人晋升,相对公司平均晋升比例如何?(判断团队是否核心)
54 | 2. 去年团队绩效最好/最差的人做了什么才获得了这个绩效?(判断团队价值观)
55 | 3. 团队成员每周/每天有哪些例行性的考核工作?(判断团队工作风格)
56 |
57 | 而至于直接上级的为人,可以通过加联系方式,搜社交媒体之类的方式做一个基本了解。
58 |
59 | ### 关于工作
60 |
61 | TBD
62 |
63 |
--------------------------------------------------------------------------------
/cheng-wei-xue-sheng/cheng-wei-xue-sheng.md:
--------------------------------------------------------------------------------
1 | # 成为学生
2 |
3 | ## 愚昧之巅与绝望之谷
4 |
5 | 大学毕业之后,我随波逐流的随便找了家公司工作,因为公司要求学了Delphi、C#之类的几种编程语言,然后过了几年朝九晚五的安逸生活。
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 |
--------------------------------------------------------------------------------
/cheng-wei-xue-sheng/li-jie-zhuan-ye-ke.md:
--------------------------------------------------------------------------------
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 | [维基百科](https://zh.wikipedia.org/wiki/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B)上对软件工程的起源有着比较详细的说明:
46 |
47 | > 1960年代中期开始爆发众所周知的软件危机,硬件成长率每年大约30%,软件每年只勉强以4~7%速度在成长,信息系统的交付日期一再延后,许多待开发的软件系统无法如期开始。1960年代软件开发成本占总成本20%以下;1970年代软件成本已达总成本80%以上,软件维护费用在软件成本中高达65%。1986年公布的数据,所有验收的外包软件中,竟然只有4%可用,其余96%却是不堪一用。大部分的企业自行开发的信息系统中,有四分之三也是功败垂成。因此软件维护成本居高不下,软件产品质量低落是最主要的原因。
48 | >
49 | > 1968年秋季,NATO(北约)的科技委员会召集了近50名一流的编程人员、计算机科学家和工业界巨头,讨论和制定摆脱“软件危机”的对策。在那次会议上第一次提出了软件工程(software engineering)这个概念,研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来的学科。
50 |
51 | 简单来说,就是软件工程出现之前,编程是一门手艺,但是由于技术发展太快,手艺人经常把事情搞砸。软件工程出现之后,定义了软件的生命周期、软件开发的流程、以及整理了大量的软件开发最佳实践,最终得以让“软件开发”这件事情完成了由手艺人独立接单到社会化大规模生产的转变。
52 |
53 | 《软件工程》就是教授软件开发的工程方法的课程,通过学习软件工程,可以更“规范”的进行软件开发活动。
54 |
55 | 但是,软件工程课程本身涵盖的方面太多,因此对于具体的编程的核心过程:设计与开发,介绍的比较粗浅。
56 |
57 | #### 建议:了解一个现代构建工具
58 |
59 | 在实际工作时,除了生命周期管理之外,依赖管理也是每天都要接触的工作,现代依赖工具已经成为了绝大多数工程,甚至是编程语言的标配,但是目前的大学课程却比较少提及这部分内容。对构建工具的周期、流程和依赖管理有基础的了解,能够解决日常中很多无效的工作。
60 |
61 | 推荐教材:各构建工具的官网文档。
62 |
63 | ## 软件的设计与开发
64 |
65 | ### 面向对象程序设计
66 |
67 | 在介绍《面向对象程序设计》这门课之前,要先理解一下“设计”与“实现”的区别。
68 |
69 | 可以把程序设计类比成建筑设计:建筑设计师通过图纸、文档描述建筑的建造方案,程序设计师通过UML图、规格文档等描述软件的建造方案。
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 | 推荐教材:PlantUML官网
102 |
103 | #### 建议:学习程序开发
104 |
105 | 作为程序员,仅学习面向对象(或者面向什么其他的东西)的设计思想显然是不够的,在完成对问题的建模之后,还需要编写具体的实现代码。
106 |
107 | 虽然在课程里也会有程序开发的章节,但毕竟不是专业介绍编程语言的教材,很多时候只是能简单看看的程度。
108 |
109 | 推荐教材:
110 |
111 | * 如果是实践型的同学,推荐“Head First”系列,比如《Head First Java》、《Head First Go》等快速入门,然后在实践中加深理解。
112 | * 如果是理解型的同学,找各语言评分最高的书,基本上会讲解的比较全面。
113 |
114 | #### 建议:练习程序开发
115 |
116 | 大部分大学的程序设计课程都会有专门的课程设计,设计目标是做一些CRUD之类的项目,能够对对应语言的开发有个基本的学习。
117 |
118 | 但是,大部分项目的模式都比较固定,意味着网上能找到的答案也比较固定,有些课程设计甚至用了十几年,还是当年的样子,这就导致很多毕业生写出来的代码带着一种20年前的风格。
119 |
120 | 我建议有余力的同学可以找一下自己学习的编程语言里,目前比较成熟的依赖库(比如说web框架),然后参考依赖库的官方示例文档(比如C++的oat++,Java的spring-boot、Golang的gin等等),用现代的方法实现一些功能。
121 |
122 | 推荐教材:各成熟依赖库的示例文档。
123 |
124 | #### 建议:或许可以试试Java
125 |
126 | 一部分《面向对象程序设计》使用的语言是C++(比如我当年就是),虽然C++也是具备面向对象特征的语言,但是它本身的语法、概念和复杂度都太高了,甚至语言的复杂度远远超过了面向对象思想本身,在通过C++学习面向对象课程的过程中,很有可能被C++本身的多继承、宏、内存分配与回收这些技术点搞到怀疑人生--但是这些跟面向对象本身又没什么关系。
127 |
128 | 因此我建议通过更简单的面向对象语言入手,学习面向对象程序设计,比如说Java:语言本身没有那些复杂而又晦涩的概念,也不需要额外关心内存、指针或者示例代码里的奇技淫巧。
129 |
130 | 推荐教材:Java编程思想
131 |
132 | #### 建议:多学几门语言
133 |
134 | 面向过程、面向对象和函数式
135 |
136 | 编程语言层出不穷,但是核心的建模思想还是只有几个大的方向,学习这几种编程语言思想,对未来更快速的掌握新的编程语言会非常有帮助。
137 |
138 | 推荐学习:Lisp 《The Little Schemer》
139 |
140 | 编译语言和脚本语言
141 |
142 | 大学里绝大部分课程都是编译型语言,但是到了日常工作中,会有很多“搞一下”的场景,比如快速搭建一个网站,或者简单统计一个数据,至少学会一门脚本语言,能够大大提升日常工作的效率。
143 |
144 | 推荐学习:Python《Head First Python》
145 |
146 | ### C程序设计
147 |
148 | 这大概是当年让我最困惑的一门课程:
149 |
150 | 1. 这门语言能干啥,为什么非要学它
151 | 2. 明明只是学习一门语法不是很复杂的编程语言,但是为什么我就是学不明白?
152 |
153 | 过了很久,我才逐渐理解原因--学习C语言有两个替代不了的特性:
154 |
155 | 1. 直接与硬件地址打交道,适合帮助理解内存、IO、操作系统等底层原理
156 | 2. 语言本身不复杂,适合用来描述数据结构与算法
157 |
158 | 但是,教材写的实在是太差了,导致那么多人学的云里雾里(不知道现在高校是否还在用谭浩强的C语言教材)。因此,我强烈建议换一本教材来学习C语言。
159 |
160 | 推荐教材:《C Primer Plus》
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 | 而《编译原理》包含的内容,虽然连接了高级编程语言与机器语言,但是其中的大部分知识(词法分析、语法分析、语义分析等)却自成一派,跟其他知识的关联性并不大,因此学起来会相当枯燥。因此,我更推荐通过对lex及yacc的实践,加深对编译器的理解。
192 |
193 | #### 建议:学习《lex与yacc》
194 |
195 | lex是一个创建词法分析器的程序,yacc是一个创建语法分析器的程序。有了这两个程序,我们就能开发出一个新的编译器,创造一门新的编程语言!
196 |
197 | 而在使用lex与yacc的过程中,既是对编译原理的应用,也是从另一个角度对编译原理的学习。无论从哪个角度,缺少《lex与yacc》的编译原理学习,都是不完整的。
198 |
199 | ### 操作系统
200 |
201 | 这里是我们日常开发的应用程序与硬件的分水岭,操作系统与绝大部分计算机知识都有一定关系,可以说它一定程度上会决定未来职业发展的技术广度。
202 |
203 | #### 建议:学习《从零开始写一个简单的操作系统》
204 |
205 | 如果想真正深入的理解操作系统的原理(而不是应付考试),那么没有什么比自己写一个操作系统更具有说服力的了。
206 |
207 | 甚至于,你只要学习了《写操作系统》的前几章,实现了一个基础的BootLoader,对操作系统的理解就已经能甩开《操作系统》课程考试前几名的那些人几个身位了。
208 |
209 | #### 建议:学习《链接器与加载器》
210 |
211 | 绝大多数大学没有这门课程,但是我认为这是必须学习的一门课程,它主要讲的是编译器产生的文件,是如何通过操作系统的帮助,最终实际运行在计算机上的。
212 |
213 | 学习了它之后,能把从“操作系统”到“软件工程”的这条链路上的所有知识体系串联起来。对于未来的问题排查、开发效率提升、微服务系统设计能力、代码优化……等等等等,都会有不同程度的帮助。
214 |
215 | 计算机领域,或许没有其他任何一门专业课能有这种“四两拨千斤”的效果。
216 |
217 | #### 建议:学习《深入理解Java虚拟机》
218 |
219 | 如果是Java系的,除了操作系统之外,还有一层jvm虚拟机挡在“应用程序”和“系统程序”之间,无论是找工作,还是日后工作中的问题排查和性能优化,这部分的知识也不可或缺。
220 |
221 | ### 计算机网络
222 |
223 | 解决了程序单机运行的原理之后,接下来一个通用的原理部分就是《计算机网络》,虽然多媒体、人工智能等等方向也有各自的原理,但是网络方向伴随着互联网兴起而逐步成为了计算机行业的基础设施。
224 |
225 | 但是,网络部分的原理同样相当抽象而枯燥,我做了这么多年技术面试,绝大多数的程序员都能够说出OSI模型,但是能把OSI模型套用到具体问题的,可能连1%的人都没有。
226 |
227 | #### 建议:学习《TCP/IP详解》
228 |
229 | 如果不做网络相关的工作,作为普通开发日常接触最多的应该就是TCP/IP协议,日常工作用到的绝大部分网络原理,也是TCP/IP相关的原理,因此,单独学习TCP/IP是有一定意义的。
230 |
231 | 但是,TCP/IP本身涉及的知识量也足够惊人,因此只推荐给学习能力强的人。
232 |
233 | #### 建议:学习使用wireshark
234 |
235 | wireshark本身是个抓包分析工具,如果是动手能力强,不想看那么多字的TCP/IP枯燥的原理的话,也可以通过一个“捷径”学习TCP/IP的基础知识:抓包。通过观察现有程序的网络通讯包,并加以解释,也可以快速掌握一部分TCP/IP知识(但是要记住:这部分知识是经验性的,视野会存在局限)。
236 |
237 | 推荐书籍:《Wireshark网络分析就这么简单》、《Wireshark网络分析的艺术》
238 |
239 | ## 计算机运行原理(硬件)
240 |
241 | ### 计算机组成原理
242 |
243 | 对于非电子相关专业的计算机专业课程,《组成原理》已经算是计算机底层原理中最接近硬件的课程了,涉及了几乎所有硬件的基础工作原理。
244 |
245 | 坦率的讲,学习组成原理,能够对后续软件开发工作产生的直接帮助不多(偶尔也会有),但是不了解这部分知识,程序设计、问题排查或者架构思考的深度会受到影响,很多看上去非常“互联网”“分布式”的技术,底层核心思想其实和基础的单机硬件结构没有什么区别,回过头来看,绝大部分当今看似新潮的互联网架构,实际上只是单机组成原理的衍生品。
246 |
247 | 掌握组成原理的基本思想,是未来程序设计能力的一片重要的拼图。
248 |
249 | #### 建议:买个开发板
250 |
251 | 如果经济条件允许,可以买个便宜的开发板,即使只是做个简单的GPIO操作,也会对计算机的软硬件有个更直观的认识。同时,大部分开发板会附赠一大坨教程,也算是不错的补充教材。
252 |
253 |
--------------------------------------------------------------------------------
/cheng-wei-xue-sheng/xue-xiao-xue-li-yu-zhuan-ye.md:
--------------------------------------------------------------------------------
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 | * 都是想去互联网公司,一个北京普通211毕业的学生,从进学校之后就从毕业生那里了解了之前互联网公司的实习、工作情况,到了实习期能去2-3家2线互联网公司实习,毕业前参与十几个互联网公司的招聘;
28 | * 而一个互联网产业发展一般的省会城市的211毕业生,毕业生去互联网公司的寥寥无几,实习期大多是找周围的某某研究所,毕业前能参与几个知名大公司的招聘会,能最终入职的更是寥寥无几。
29 |
30 | 至于非本科以上学历的应届生,或者具体到“我xx大学xx专业毕业之后能不能到xx公司”这类问题,只能说:这得看具体情况。
31 |
32 | 计算机这个行业目前还没有达到稳定期,从前些年疯狂扩张到近几年开源节流也只是几年的功夫。在行情好的年份,几乎所有公司都在为了招人而招人,只要是个头脑正常的应届毕业生,基本上都能找到满意的工作。而到了差的年份,大厂的收简历门槛基本就是211、985,甚至有些公司会要求“只收这几所学校的简历”。
33 |
34 | 但是,如果把眼界放宽,计算机行业并不仅是那几个互联网大厂,更多的职位其实反而隐藏在企业的信息化部门之中,那上面的这些结论可能很多也都会被推翻了。
35 |
--------------------------------------------------------------------------------
/cheng-wei-zhi-yuan/kai-juan-kao-shi.md:
--------------------------------------------------------------------------------
1 | # 开卷考试
2 |
3 | 虽然可以成为个人开发者、业余开发者或者参与创业,但是绝大多数程序员还是会入职到某个公司,成为公司的职员。
4 |
5 | 已经有无数关于“走入职场”的文章,可见“成为职员”这个角色转变对于绝大多数人来说意义重大:两三岁进入幼儿园代表着开始集体生活,六七岁进入小学标志着成为学生,那么成为职员这个转变又意味着什么?
6 |
7 | 我进入职场以后发现自己相比于学生角色,反而莫名的适应工作生活。因此我也没有在意过“职员”这个角色跟学生有什么区别,直到开始写这本书时,我才开始回过头来,总结自己适应工作生活的原因。
8 |
9 |
--------------------------------------------------------------------------------
/xu/guan-yu-wo.md:
--------------------------------------------------------------------------------
1 | # 关于我
2 |
3 | 新浪微博平台研发部资深技术专家,视频博主。
4 |
5 | 微博: [@axb的自我修养](https://weibo.com/u/1809500942)
6 |
--------------------------------------------------------------------------------