печально быть антисоциальным - Post a comment

Jan. 4th, 2005

[info]smejmoon

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:


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 chari (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.

Read Comments

Reply:

From:
( )Anonymous- this user has disabled anonymous posting.
Username:
Password:
Subject:
No HTML allowed in subject
  
Message:

Notice! This user has turned on the option that logs your IP address when posting.