01:27 pm - Why Joel on Software sucks?
Džoela konteksts: Advice for Computer Science College Students.
Viņa atrunas:"I, too, have no idea what I'm talking about when I give advice to college students." "So you'd be better off ignoring what I'm saying here [..]"
Slikts ir viņa otrais padoms: "Learn C before graduating." (Pirms beidz skolu, iemācies C)
Un tagad pēc kārtas:
- "it is still the lingua franca of working programmers"
C ir valoda, kurā tiek veidotas programmu saskarmes(API), bet ne tā, kurā sarunājas programmētāji. Praktiski tas nozīmē to, ka jājēdz, kā iekš C tiek izsauktas funkcijas un pamattipi.
- "ML, Java, Python, whatever trendy junk they teach these days." Gan ML, gan Python palīdzēs iemācīties veidot algoritmus. Tas arī būtu tas, kur vajadzētu pavadīt lielāko daļu laika.
- "You need to spend at least a semester getting close to the machine" Tapēc ir assembly:
mov al, 0x61
pārveidojas par x86/IA-32 mašīninstrukciju 10110000 01100001
, kas savukārt procesora reģistrā al
ievieto skaitli 97. Ciešāk pie dzelžiem tikai ar lodāmuru. Assambly ir LU progammā un C ir nesalīdzināmi augstāka līmeņa draza.
- "or you'll never be able to create efficient code in higher level languages" Augsta līmeņa valodās tiek optimizēts algoritms nevis mašīnkods. Optimizēšana vispār ir atsevišķa tēma. Pirmkārt, optimizēt tikai šaurās vietas, otrkārt optimizet algoritmu un tikai, treškārt, gūt tuvību ar dzelžiem.
- "You'll never be trusted to create architectures for large scale projects." FUD (Fear, Uncertainty, and Doubt. A common motivational strategy.)
Esmu piekasīgs, bet vienīgais kam šajā rindkopā piekrītu ir, ja Tu nezini C, "You'll never be able to work on compilers and operating systems". Izņemot Lispus un SmallTalkus un daudz ko citu, bet nebūsim sīkumaini. C rakstot kerneļus un ļoti ātras programmas noder.
Un tagad pats labākais "if you can't explain why
while (*s++ = *t++);
copies a string, or if that isn't the most natural thing in the world to you, well, you're programming based on superstition".
- Joel, this sucks!Neiedziļinoties debatēs, par to, ko nozīmē 'superstition', pastāstīšu par
while (*s++ = *t++);
.
Sucks 1: Tiek izmantoti C stringi un tas nav teksts. Tas ir datu masīvs (pēc kārtas sekojošu elementu kopums) no 8bitu skaitļiem, kur pēdējais elements ir 0 (nulle). Pārējie apzīmē rakstzīmes. ASCII kodējumā, vai kādā citā, kurš neietver sevī elementu ar kodu 0.
- C stringi nesatur informāciju par valodu un kodējumu, kādā šīs valodas zīmes ir pierakstītas. Attiecīgi viņi ir izmantojami tikai speciālgadījumā (ASCII un ļoti līdzīgie kodējumi, kuros var ierobežoti attēlot dažas valodas). Mūsdienīgos kodējumos, kā UTF-8/UTF-16 tas vairs nav iespējams. (
šeit ir koncentrēti uzrakstīts par citām stringu problēmām)
Sucks 2: C stringus ir neērti lietot Pirms nav pāriets viss strings, nav zināms tā garums, attiecīgi nav zināms, cik daudz vietas jārezervē, cik
char
i (skaitļa tips) jākopē un tamlīdzīgi. Tāpat ir grūtības ar citām manipulācijām, kā stringu apvienošanu, saīsināšanu.
Nu ko, tātad
s
un
t
ir
char*
tipa mainīgie. Var arī nebūt, bet Džoels domā, ka esam gudri bērni un
lasām citus viņa sacerējumus.
char*
ir norāde(pointer) uz masīvu, kas sastāv no
char
tipa elementiem.
char
ir 8 bitu skaitlis (0-255).
s++
ir operators, kurš atgriež
s
vērtību un pēc tam norāda uz nākošo masīva elementu. To pašu dara arī
t++
, tikai ar masīvu
t
.
*
ir operators, kas, atrodoties norādes priekšā, atgriež pašu mainīgo uz kuru tiek norādīts.
=
ir operators, kas pārkopē vienu mainīgo uz otru un atgriež sākotnējā mainīgā vērtību. Piemēram:
int a,b; a = b = 3;
gan
a
, gan
b
būs vērtība 3.
Tātad
*s++ = *t++
ņem vērtību, kas atrodas mainīgajā uz ko norāda
t
, tad pārvieto norādi uz priekšu, šo vērtību iekopē mainīgajā uz ko norāda
s
un pārvieto norādi (
s
) uz priekšu un tad atgriež vērtību kāda bija iekš
*t
).
Uz to arī paļaujas
while(
izteiksme
)
, kas pārbauda, vai izteiksme ir patiesa. Tā kā pēc C noteikumiem visi skaitļi izņemot nulli tiek vērtēti kā patiesi, tad cikls (vērtību kopēšana) turpinās, līdz tiek sasniegts pēdējais elements, kas, kā zināms, ir 0.
Kapēc šitais Sucks 3? Pārlasiet vēl iepriekšējo. Ja kautko nesapratāt, vai es kautkur kļūdījos, tad sucks.
Sucks 4: efficiency or memory leaks? Un kas būs ja
s
un
t
ir dažādu garumu masīvi? Ja
t
ir garāks, tad
s
paredzētā vieta tiks aizpildīta, bet programma turpinās rakstīt atmiņā. Atmiņā šajā vietā var būt paredzēta vieta kodam (skatīt augstāk assambleru), vai citiem datiem. Un tad jau sākās visas kļūdu un hackeru briesmas.
Sucks 5: Kods ir sūdīgs. Netikai tapēc, ka izmantoti C triki, bet arī tapēc, ka mainīgie apzīmēti nesaprotamos vārdos. Varētu domāt, ka
s
nozīmē
source
, un
t
-
target
, bet kapēc tad no 'target' tiek kopēts uz 'source'? Laikam tomēr tie nozīmē kautko citu.
Šis ir tāds ilustratīvs piemērs, kapēc nevajadzētu mācīties C, pirms nav skaidrs, ko ar to grib panākt. Džoels var droši atgriezties savā darbā, kur viņš ikdienā pārlūko VisualBasic.NET programmētājus un raksta reklāmrakstus savā mājas lapā.
Es savukārt tikko teicami uzrakstīju eksāmenu programmēšanā (izmantojot C++) un došos uz darbu, kur tiks ģenerēts C++, izmantojot
Python.
Pārējie Džoela padomi nav zemē metami:
1. Learn how to write before graduating.
2. Learn C before graduating. 3. Learn microeconomics before graduating.
4. Don't blow off non-CS classes just because they're boring.
5. Take programming-intensive courses.
6. Stop worrying about all the jobs going to India.
7. No matter what you do, get a good summer internship.
8. Seek professional help for that self-esteem thing.