PHP4 èëè ASP.NET - ÷òî ëó÷øå |
ASP.NET - ýòî íå ïðîäîëæåíèå ASP. Ýòî êîíöåïòóàëüíî íîâàÿ òåõíîëîãèÿ Microsoft, ñîçäàííàÿ â ðàìêàõ èäåîëîãèè .NET. Êëþ÷åâûìè ñòîðîíàìè .NET ÿâëÿþòñÿ ìàñøòàáèðóåìîñòü, êðîññïëàòôîðìíîñòü, ìåæúÿçûêîâîå âçàèìîäåéñòâèå è øàòêîå ïîíÿòèå "áåçîïàñíîå ïðîãðàììèðîâàíèå" (safe-programming).
PHP - íàîáîðîò, îòêðûòàÿ è áåñïëàòíàÿ òåõíîëîãèÿ. Ðàçóìååòñÿ, ðàñøèôðîâûâàòü ñåãîäíÿ PHP êàê Personal Home Page áûëî áû íåïðàâèëüíî, íî îòãîëîñêè ïðîøëîãî äàþò î ñåáå çíàòü è ïî ñåé äåíü. PHP - ñêðèïòîâûé ÿçûê, ñîçäàííûé èñêëþ÷èòåëüíî äëÿ äèíàìè÷åñêîãî âûâîäà HTML. Ýòî íå çíà÷èò, ÷òî íà íåì íåëüçÿ ñîçäàòü êðóïíûé ïðîåêò. Ýòî çíà÷èò, ÷òî ñîçäàòü êðóïíûé ïðîåêò íà PHP äîðîãî è òðóäíî.
Äëÿ ïðîãðàììèðîâàíèÿ íà PHP íå íóæíà äîðîãàÿ ñðåäà ïðîãðàììèðîâàíèÿ. ×òîáû íàó÷èòüñÿ ïèñàòü áîëåå èëè ìåíåå ðàáîòîñïîñîáíûå ñêðèïòû, äîñòàòî÷íî îäíîãî-åäèíñòâåííîãî ó÷åáíèêà. Ñ ASP.NET òàêîé ôîêóñ íå ïðîéäåò. Áåç Visual Studio, MSDN è èíîãäà - äîñòóïà â Èíòåðíåò òàì äåëàòü íå÷åãî. Áîëüøóþ ÷àñòü âðåìåíè íà÷èíàþùèé ðàçðàáîò÷èê òðàòèò íà øòóäèðîâàíèå MSDN. À ê òîìó âðåìåíè, êîãäà îí âûó÷èò íàâîðî÷åííóþ ìîäåëü êëàññîâ è âñå íåîáõîäèìûå åìó ôóíêöèè, Microsoft íàâåðíÿêà ïðèäóìàåò ÷òî-òî íîâîå. Ïîìíèòñÿ, êòî-òî ãîâîðèë, ÷òî ÷åì áîëüøå âàðèàíòîâ ïðåäëîæåíî, òåì áîëüøå âðåìåíè óõîäèò íà âûáîð ëó÷øåãî. ASP.NET - ÿðêîå òîìó ïîäòâåðæäåíèå.
Çàòî åñëè âûó÷èòü... Ñ÷åò÷èê ïîñåùåíèé? - ïîæàëóéñòà, äåñÿòü ñòðî÷åê. Äîáàâèòü ñþäà òàêóþ æå òàáëèöó? - äâà-òðè ùåë÷êà ìûøêîé, ïÿòíàäöàòü ñòðî÷åê òåêñòà. Äðóãîé âûâîä èíôîðìàöèè? - íåò ïðîáëåì: äåëàåì äî÷åðíèé êëàññ, ïåðåêðûâàåì ôóíêöèþ, îòâîäèì íà îòëàäêó ÷åòâåðòü ÷àñà, ïðèâÿçûâàåì ê âûâîäó âòîðîé òàáëèöû - ãîòîâî! Âîîáùå, ðàáîòà â ASP.NET ñ ïðèìåíåíèåì Visual Studio ñèëüíî íàïîìèíàåò ðàáîòó â Delphi, ñ òîé ëèøü ðàçíèöåé, ÷òî âñå ïðîèñõîäèò ãîðàçäî áûñòðåå, ïðîùå è ëîãè÷íåå. Îñíîâíûå æå ÿçûêè, íà êîòîðûõ ïèøóòñÿ ASP.NET-ïðèëîæåíèÿ, - Visual Basic.NET è C#, - ÿâëÿþòñÿ íàñëåäíèêàìè ñîîòâåòñòâåííî Visual Basic è Java/C++. È åñëè ïåðåõîä ñ Visual Basic íà Visual Basic.NET òðåáóåò íåêîòîðîãî ïåðåñìîòðà ôèëîñîôèè ïðîãðàììèðîâàíèÿ (òàê êàê îò ñòàðîãî Áåéñèêà îñòàëàñü ëèøü ÷àñòü ñèíòàêñèñà è íàçâàíèå), òî ïåðåõîä ñ Ñ++, è îñîáåííî ñ Java íà C#, îðãàíè÷åí íàñòîëüêî, ÷òî íå äîëæåí çàíèìàòü áîëüøå äâóõ-òðåõ íåäåëü.
Òåîðåòè÷åñêè ïîä ASP.NET ìîæíî ïèñàòü ïðîãðàììû íà ëþáîì ÿçûêå, äëÿ êîòîðîãî èìååòñÿ ñîîòâåòñòâóþùèé êîìïèëÿòîð. Îäíàêî íà ïðàêòèêå äëÿ ñîçäàíèÿ ASP.NET-ïðèëîæåíèé èñïîëüçóþòñÿ ãëàâíûì îáðàçîì Visual Basic.NET è C# (ãäå-òî ïîçàäè ïëåòóòñÿ managed C++ è J#). Íåêîòîðûå ïðîãðàììíûå ñðåäû - íàïðèìåð, Delphi 8 - îáåñïå÷èâàþò íîìèíàëüíóþ ïîääåðæêó ASP.NET, íî òîëêó îò íåå, ïðÿìî ñêàæåì, íåìíîãî.
"Ðîäíàÿ" ñðåäà ASP.NET - IIS, ðàáîòàþùèé ïîä óïðàâëåíèåì Windows. Äà, IIS èçâåñòåí êàê íå ñàìûé ñòàáèëüíûé âåá-ñåðâåð, à Windows - êàê íå ñàìàÿ ñòàáèëüíàÿ îïåðàöèîííàÿ ñèñòåìà. Íî âîò íåáîëüøàÿ èñòîðèÿ èç æèçíè.
Íà îäíîé ìîåé ðàáîòå ñòîÿë ñåðâåð ïîä óïðàâëåíèåì Windows 2000 è IIS, íà êîòîðîì ñèñàäìèí äåðæàë â òîò ìîìåíò áîëüøå äâóõ ñîòåí ñàéòîâ. Áîëüøàÿ èõ ÷àñòü ñîñòîÿëà èç äèíàìè÷åñêè ñãåíåðèðîâàííûõ ASP-ñòðàíèö (ASP.NET òîãäà òîëüêî ïîÿâèëñÿ, è åäèíñòâåííûé, êòî ðèñêîâàë ñ íèì ðàáîòàòü, - ïðàâäà, íà îòäåëüíîé ìàøèíå, - áûë âàø ïîêîðíûé ñëóãà). Òàê âîò, ñåðâåð çà äâà ãîäà ïåðåçàãðóæàëñÿ âñåãî ïàðó ðàç, åñëè íå ñ÷èòàòü îáÿçàòåëüíûõ ïåðåçàãðóçîê ïîñëå óñòàíîâêè êðèòè÷åñêèõ îáíîâëåíèé. Íà äðóãîé ðàáîòå, êîòîðîé ÿ çàíèìàëñÿ ïàðàëëåëüíî, ñòîÿë ñåðâåð ñ FreeBSD 4.x, èñïîëíÿâøèé ðîëü ïðîêñè/ôàéðâîëëà äëÿ ëîêàëüíîé ñåòè. Îí ïàäàë ðàç, à òî è äâà ðàçà â ìåñÿö. ß ñàì íåêîòîðîå âðåìÿ áûë ñèñàäìèíîì è íå ïîíàñëûøêå çíàþ, êàê íàäî ïîñòàðàòüñÿ, ÷òîáû äîñòè÷ü òàêèõ âïå÷àòëÿþùèõ ðåçóëüòàòîâ â ñòàáèëüíîñòè ðàáîòû è Windows, è FreeBSD. Ñ òåõ ïîð ÿ óâåðåí, ÷òî 90-95% ñòàáèëüíîñòè ðàáîòû ñåðâåðà îáåñïå÷èâàåòñÿ âîâñå íå âûáîðîì "ïðàâèëüíîé" ñèñòåìû, à âûáîðîì "ïðàâèëüíîãî" ñèñàäìèíà.
ß íå ïûòàþñü óáåäèòü êîãî-òî â òîì, ÷òî Windows ðàáîòàåò áîëåå ñòàáèëüíî è ïðåäñêàçóåìî, ÷åì Unix/Linux. Ìàëî òîãî, ÿ ñàì òàê íå äóìàþ. Íî ASP.NET - ýòî íå òîëüêî Windows. Ñóùåñòâóåò, íàïðèìåð, ïðîåêò Mono, ïîçâîëÿþùèé çàïóñêàòü ëþáûå .NET-ïðèëîæåíèÿ ïîä Linux (è, ñîîòâåòñòâåííî, ïîä FreeBSD â ðåæèìå áèíàðíîé ñîâìåñòèìîñòè), ñóùåñòâóåò mod (ïî-íàøåìó - ïëàãèí) Apache äëÿ îáðàáîòêè ASP.NET-ïðèëîæåíèé. Íî âñå-òàêè ASP.NET è *nix - ïîêà ÷òî áîëüøå ãåòåðîãåííàÿ ñðåäà, ñî âñåìè âûòåêàþùèìè.
ASP.NET íå ïðèñïîñîáëåí äëÿ ìàëåíüêèõ ïðîåêòîâ è òåì áîëåå - äëÿ íåìíîãî÷èñëåííûõ ñðàáîòàâøèõñÿ ãðóïï, êîòîðûì íå òðåáóåòñÿ ÷åòêîå óïðàâëåíèå. Ïðè÷èí òîìó ìíîæåñòâî - íà÷èíàÿ îò âûñîêîé ñòîèìîñòè ïëàòôîðìû è çàêàí÷èâàÿ ñëîæíîñòüþ ìîäåëè êëàññîâ .NET. Âïåðâûå âçÿâøèñü çà ïðîãðàììèðîâàíèå ïîä .NET, ÿ íå ìîã ïîíÿòü, êòî ìîæåò âñå ýòî âûó÷èòü, íà êàêîãî èíòåëëåêòóàëüíîãî ìîíñòðà ýòî âñå ðàññ÷èòàíî? Ïîòîì ïîíÿë - íèêòî. Êðåäî .NET-ïðîãðàììèðîâàíèÿ: íå ëåçü íå â ñâîå äåëî. Ïèøè ñâîé ìîäóëü, âûó÷è ñâîè ôóíêöèè, çíàé ñâîå ìåñòî - ýòîò ïðèíöèï â êîëëåêòèâå ðàáîòàåò çàìå÷àòåëüíî.
Ïî èäåîëîãèè Microsoft, ïðîãðàììèñò - ìàëåíüêèé âèíòèê õîðîøî îòëàæåííîãî ìåõàíèçìà. Îäèíî÷êè-êàìèêàäçå âðîäå ìåíÿ, ñâÿòî âåðÿùèå â ñâåòëîå áóäóùåå ýòîé êîðïîðàöèè, íå ñ÷èòàëèñü è íå ñ÷èòàþòñÿ. Èñêëþ÷àåì íàñ - è îñòàþòñÿ áîëüøèå, áûñòðî è ïîñòîÿííî ðàñøèðÿþùèåñÿ èíòåðíåò-ïðîåêòû, ãäå îäèí ïðîãðàììèñò îòâå÷àåò çà îäèí ìîäóëü. À êàêèì, ñîáñòâåííî ãîâîðÿ, åùå ïðîåêòàì òðåáóåòñÿ êðîññïëàòôîðìíîñòü è ìóëüòèÿçû÷íîñòü ïî óìîë÷àíèþ? Òîëüêî òàêèì, ãäå ìîãóò íàíÿòü òàêîãî ïðîôè, ÷òî ÿçûê, íà êîòîðîì îí ïèøåò, îòëè÷àåòñÿ îò îñíîâíîãî ïðîåêòíîãî. Òîëüêî òàêèì, êîòîðûì âïîñëåäñòâèè ìîæåò ïîòðåáîâàòüñÿ áåçáîëåçíåííîå ïîðòèðîâàíèå íà Pocket PC, MAC, ìîãóò ïîòðåáîâàòüñÿ èíòåðíåò-ñåðâèñû è ò. ä. Âîò â òàêèõ ïðîåêòàõ ASP.NET ðàçâîðà÷èâàåòñÿ íà ñëàâó. Ïðîáëåìû ñ ïðîèçâîäèòåëüíîñòüþ, íåõâàòêà ðåñóðñîâ? ×åïóõà! Êóïèì åùå êîìïüþòåðîâ, êóïèì åùå ïðîãðàììèñòîâ, êóïèì çâåçäû ñ íåáà, ëèøü áû òåìïû ðàçðàáîòêè íå ïàäàëè.
ÐÍÐ-ïðîãðàììèñòàì â ïîäîáíûõ ïðîåêòàõ äåëàòü íå÷åãî. Ïî÷åìó? Äà ïîòîìó, ÷òî èì ïîòðåáóåòñÿ êó÷à êîîðäèíàòîðîâ, êîòîðûì äåíüãè ïëàòèòü íàäî. Êîîðäèíàòîðîâ, áîëüøóþ ÷àñòü ðàáîòû êîòîðûõ áåðåò íà ñåáÿ ñàìà ñðåäà .NET. È, êñòàòè, ñ êëàñòåðíûìè Unix-ñèñòåìàìè îáðàùàòüñÿ òîæå íåïðîñòî. Êàê íè êðóòè, Unix - ýòî ïðåêðàñíàÿ stand-alone-ñèñòåìà, íî èìåííî ïîýòîìó ñäåëàòü êëàñòåð íà íåé ãîðàçäî ñëîæíåå, è ñîîòâåòñòâåííî, äåíåã óéäåò áîëüøå. ß íå ãîâîðþ î ñóïåðêîìïüþòåðàõ, ÿ ãîâîðþ î ïàðêå â 20-50 ìàøèí. Çà òî âðåìÿ, ÷òî óéäåò íà àâòîìàòèçàöèþ è ïîäêëþ÷åíèå äîïîëíèòåëüíîé Unix-ìàøèíû ê Unix-êëàñòåðó, ïðîãðàììèñòû íà Windows óæå äàâíî áóäóò ïèñàòü ñëåäóþùèé ìîäóëü. Íå ãîâîðÿ óæ î òîì, ÷òî êëàñòåðíàÿ ÑÓÁÄ MySQL êàê êëàñòåð ñóùåñòâóåò òîëüêî â àëüôà-âåðñèè. Àâòîìàòèçàöèÿ æå âçàèìîäåéñòâèÿ ìåæäó ìàøèíàìè íà Windows Server 2003 è SQL Server - îäíà èç ñèëüíåéøèõ ñòîðîí ýòèõ ñèñòåì (Ðåäàêöèÿ óìûâàåò ðóêè. Âñå ðàññóæäåíèÿ î ñëîæíîñòè ñîçäàíèÿ êëàñòåðîâ íà Unix öåëèêîì íà ñîâåñòè àâòîðà. Ëè÷íî ìíå êàæåòñÿ, óìåþ÷è - ýòî íå òàê óæ äîëãî, ÷òî íà Windows, ÷òî íà Unix, íî ýêñïåðòîì â äàííîì âîïðîñå ÿ íå ÿâëÿþñü è ñóäèòü íå áåðóñü. - Ïðèì. ðåä).
Òåõíîëîãèÿ ÐÍÐ â êîðíå îòëè÷àåòñÿ îò ASP.NET. Áîëüøå âñåãî îíà ïîõîæà íà êëàññè÷åñêèå ASP-ïðèëîæåíèÿ, òîëüêî ñêðèïòîâûé ÿçûê â íåé îäèí. ßçûê ÐÍÐ íàïîìèíàåò ñáîðíóþ ñîëÿíêó èç C è Perl ñ íåáîëüøèì äîáàâëåíèåì ñïåöèé â âèäå Basic è äàæå Pascal. Âñå ýòî íàòÿíóòî íà êàðêàñ èç ïðèìèòèâíîé ìîäåëè êëàññîâ, êîòîðàÿ ïðåäñòàâëÿåò ñîáîé ïðèâû÷íûå ñòðóêòóðû C ñ êîå-êàê ïðèäåëàííûì ñáîêó íàñëåäîâàíèåì. Ïðàâäà, íåäàâíî ïîÿâèëàñü ïÿòàÿ âåðñèÿ PHP, ïðåäîñòàâëÿþùàÿ íåïëîõèå âîçìîæíîñòè äëÿ îáúåêòíî-îðèåíòèðîâàííîãî ïðîãðàììèðîâàíèÿ, îäíàêî áîëüøîãî ðàñïðîñòðàíåíèÿ îíà ïîêà íå ïîëó÷èëà.
PHP4 ñëèøêîì äîâåðÿåò ïðîãðàììèñòó.  íåì íåò òèïîâ, îáúÿâëÿòü ïåðåìåííûå íåîáÿçàòåëüíî, ñóùåñòâóþò îïàñíûå êîíñòðóêöèè. Ñèíòàêñèñ PHP çàòî÷åí ïîä áûñòðîå è ïðîñòîå ðåøåíèå òèïîâûõ ïðîáëåì. Ïðè ýòîì âñÿ îòâåòñòâåííîñòü çà îïàñíûå òðþêè ëåæèò íà ïðîãðàììèñòå. ×òî, â ÷àñòíîñòè, ïðèâîäèò ê òàêîìó ðàñïðîñòðàíåííîìó ÿâëåíèþ, êàê îáíàðóæåíèå ñåðüåçíûõ îøèáîê â êîäå ÷åðåç ìåñÿö-äðóãîé ïîñëå ñäà÷è ïðîåêòà.
Îáëàñòü ïðèìåíåíèÿ PHP - íåáîëüøèå ïðîåêòû, êîòîðûå äåëàåò èëè òåñíî ñðàáîòàâøàÿñÿ ãðóïïà, èëè âîîáùå îäèí ÷åëîâåê. Áëàãîäàðÿ áåñïëàòíîñòè PHP (à òàêæå áåñïëàòíîñòè MySQL è ñàìîé ïëàòôîðìû), ýòîò ÿçûê ñòàíîâèòñÿ èäåàëüíûì âûáîðîì äëÿ íåáîëüøèõ àâòîðñêèõ ñàéòîâ èëè ñàéòîâ äëÿ ìàëîãî è ñðåäíåãî áèçíåñà. Êðîìå òîãî, PHP ðàáîòàåò áûñòðåå.
Òåîðåòè÷åñêè ASP.NET äîëæíà ðàáîòàòü áûñòðåå (âñå-òàêè çäåñü ìû èìååì äåëî ñ åäèíîæäû ñêîìïèëèðîâàííûìè áèíàðíûìè êîäàìè, òîãäà êàê PHP-ñêðèïòû êàæäûé ðàç îáðàáàòûâàþòñÿ çàíîâî). Îäíàêî PHP ëåòàåò êàê íà IIS, òàê è íà Apache è ïðè áîëüøîé (ïðàâäà, èñêóññòâåííî âûçâàííîé) íàãðóçêå âñåãäà âûäàåò ðåçóëüòàòû ëó÷øå, ÷åì ASP.NET. È óæ òåì áîëåå ëó÷øå, ÷åì êëàññè÷åñêèé ASP. Îáåñêóðàæåííûé, ÿ ïîøåë íà ñàéò Microsoft, ÷òîáû íàéòè õîòÿ áû îäíó ñòàòüþ, â êîòîðîé áû ñðàâíèâàëîñü áûñòðîäåéñòâèå PHP è ASP.NET. Áåçóñïåøíî. Çàòî íà äðóãèõ ðåñóðñàõ íàøëîñü äîâîëüíî ìíîãî ñòàòåé, àâòîðû êîòîðûõ ïðèøëè ê òîìó æå âûâîäó, ÷òî è ÿ. "Ðîäíàÿ" ñâÿçêà PHP + MySQL + Apache ðàáîòàåò áûñòðåå ASP.NET + IIS + Microsoft SQL Server 2000.
Çíà÷èò ëè ýòî, ÷òî ASP.NET õóæå? Îòíþäü. Íà òîì æå ñàéòå Microsoft åñòü ìàññà äàííûõ, èç êîòîðûõ ñëåäóåò, ÷òî ðåøåíèÿ íà áàçå Linux/Unix â öåëîì îáõîäÿòñÿ ñðåäíåìó è áîëüøîìó áèçíåñó íàìíîãî äîðîæå, ÷åì àíàëîãè÷íûå ðåøåíèÿ íà îñíîâå Windows (Áûëî áû ñòðàííî íàéòè íà ñàéòå Microsoft èíóþ èíôîðìàöèþ. Íî äîëÿ ïðàâäû â ýòîì åñòü - áåñïëàòíîñòü òåõíîëîãèé âîâñå íå îçíà÷àåò áåñïëàòíîñòè èõ èñïîëüçîâàíèÿ). Òàêèå, êàçàëîñü áû, ïàðàäîêñû íà ñàìîì äåëå âïîëíå ëîãè÷íû. Ñêîðîñòü ðàáîòû îáåñïå÷èâàåòñÿ òåì, ÷òî âñå ÐÍÐ-ïðèëîæåíèÿ ðàáîòàþò â åäèíîì àäðåñíîì ïðîñòðàíñòâå, òîãäà êàê ASP.NET çà ñ÷åò íàâîðî÷åííîé ìîäåëè êëàññîâ ìíîãîêðàòíî ïðîâåðÿåò è ïåðåïðîâåðÿåò äàííûå, óäåðæèâàÿ êàæäîå ïðèëîæåíèå â îòäåëüíîì àäðåñíîì ïðîñòðàíñòâå. Ïåðâûé ïîäõîä áîëåå áûñòð, íî ìåíåå íàäåæåí, âòîðîé - áîëåå íàäåæåí, íî çà ýòî ïðèõîäèòñÿ ïëàòèòü. ×óäåñ íå áûâàåò. Áûñòðîäåéñòâèå æå ñâÿçêè ÐÍÐ + MySQL îáåñïå÷èâàåòñÿ òåì, ÷òî ðàçðàáàòûâàþùèå ýòè äâå òåõíîëîãèè ãðóïïû î÷åíü òåñíî ñîòðóäíè÷àþò. Òî æå ñàìîå è ñî ñâÿçêîé ASP.NET + MS SQL.
Îäíàêî ñêîðîñòü ðàáîòû ÐÍÐ ñ äðóãèìè ÑÓÁÄ (÷åðåç ODBC) ðàçî÷àðîâàëà. Ñ áîëüøèíñòâîì èçâåñòíûõ ÑÓÁÄ, âêëþ÷àÿ MS SQL Server, SAP è MaxDB (òîò æå SAP, íà÷èíàÿ ñ âåðñèè 7.5), îí ó ìåíÿ ðàáîòàë ìåäëåííåå ASP.NET. Íàñêîëüêî ÿ ïîíÿë, èç-çà òîãî, ÷òî ASP.NET ñòàðàåòñÿ äåëàòü èç ÁÄ êàê ìîæíî ìåíüøå âûáîðîê, ïîìåùàÿ âñå àêòóàëüíûå òàáëèöû è äàæå ñâÿçè ìåæäó íèìè â êýø (òåõíîëîãèÿ ADO.NET â ñëó÷àå ñ MS SQL), â òî âðåìÿ êàê ÐÍÐ ñêëîíåí ãåíåðèðîâàòü ìíîæåñòâî çàïðîñîâ ê ÑÓÁÄ.
Ïàðàäîêñ ñ öåíàìè, êîãäà îïëàòèòü íåñêîëüêî ëèöåíçèé Microsoft äåøåâëå, ÷åì âçÿòü áåñïëàòíûå Unix/Linux, PHP è MySQL, òîæå âïîëíå ëîãè÷åí. Ñëåäóåò ó÷èòûâàòü, ÷òî, âî-ïåðâûõ, ýòè ïðîäóêòû áåñïëàòíû, ïîêà âû íå ñîáèðàåòåñü äåëàòü íà íèõ êîììåð÷åñêèå ïðîåêòû (Linux è PHP, êîíå÷íî, áåñïëàòíû áåç âñÿêèõ óñëîâèé. Êîììåð÷åñêàÿ ëèöåíçèÿ â ïîëíîì ñìûñëå ýòîãî ñëîâà åñòü òîëüêî ó MySQL. Íåêîòîðûå çàòðàòû íà PHP, ïîæàëóé, ãðîçÿò òîëüêî ïðîãðàììèñòàì, äåëàþùèì ñêðèïòû íà ïðîäàæó. Äàáû íå îòêðûâàòü êîä ñêðèïòîâ, èì ïðèõîäèòñÿ èñïîëüçîâàòü ïðîäóêòû êîìïàíèè Zend, à îíè, óâû, ïëàòíûå. - Ïðèì. ðåä), à âî-âòîðûõ, ÷òî ðàçðàáîòêà è ïîääåðæêà ïðîåêòîâ ïîä ýòè ïëàòôîðìû â öåëîì îáõîäèòñÿ äîðîæå. Êðîìå òîãî, Linux â ðÿäå ñëó÷àåâ ðàáîòàåò ìåäëåííåå Windows. Âîçìîæíî, ÿ îøèáàþñü, íî íè äëÿ êàêîé ÑÓÁÄ ÿ è áëèçêî íå âèäåë òàêîãî êîëè÷åñòâà êðèòè÷åñêèõ èñïðàâëåíèé è ñîîáùåíèé, êàê äëÿ MySQL. À âñå ýòî åñòü ðèñê (Ðåäàêöèÿ óìûâàåò ðóêè. Âñå ðàññóæäåíèÿ î ñëîæíîñòè ñîçäàíèÿ êëàñòåðîâ íà Unix öåëèêîì íà ñîâåñòè àâòîðà. Ëè÷íî ìíå êàæåòñÿ, óìåþ÷è - ýòî íå òàê óæ äîëãî, ÷òî íà Windows, ÷òî íà Unix, íî ýêñïåðòîì â äàííîì âîïðîñå ÿ íå ÿâëÿþñü è ñóäèòü íå áåðóñü. - Ïðèì. ðåä.).
Òåïåðü PHP. Åñëè êðàòêî îõàðàêòåðèçîâàòü îùóùåíèÿ îò ðàáîòû ñ íèì - ýòî ïîñòîÿííàÿ îòëàäêà, äåáàã. È äåëî äàæå íå â òîì, ÷òî ïîëíîöåííîãî äåáàããåðà ïîêà íåò (ïî êðàéíåé ìåðå, ëó÷øèé, ÷òî ÿ íàøåë, Zend Studio, íå èäåò íè â êàêîå ñðàâíåíèå ñ äåáàããåðîì Visual Studio), à â òîì, ÷òî ñàìî óñòðîéñòâî ÿçûêà ñïîñîáñòâóåò ñåðüåçíûì ëîãè÷åñêèì îøèáêàì.
Âîò ïðèìåð, êîòîðûé íåäàâíî ïðèñëàëà ìíå îäíîêóðñíèöà, ïîïðîñèâ ïîìî÷ü:
<p><?$bukvi = "abcdefg";$stroka = "abcdefg";echo $stroka[0]; echo "<br>";echo $bukvi[0]; echo "<br>";if ($srtoka[0] == $bukvi[0])echo "ñòðîêè ñîâïàäàþò";elseecho "ñòðîêè íå ñîâïàäàþò";?></p>
Ñöåíàðèé ðàáîòàåò, íî ðàáîòàåò íåïðàâèëüíî.
Äàæå ïðèìèòèâíàÿ îïå÷àòêà (âûäåëåíà êðàñíûì) ïðèâîäèò ê ëîãè÷åñêîé îøèáêå, êîòîðîé â C# íå áûëî áû â ïðèíöèïå. Âîîáùå, â ÐÍÐ îáúÿâëåíèå ïåðåìåííûõ îòñóòñòâóåò êàê êëàññ, ÷òî, ñ ìîåé òî÷êè çðåíèÿ, áîëüøîé ìèíóñ. À ëþáîé ñâåäóùèé â ïðîãðàììèðîâàíèè ÷åëîâåê ïîíèìàåò, ê ÷åìó ïðèâîäèò îòñóòñòâèå òèïîâ â êðóïíîì ïðîåêòå.
Êîíå÷íî, ïðîãðàììèñòû íà ÐÍÐ ìîãóò ñêàçàòü, ÷òî ÿ íè÷åãî íå ïîíèìàþ: âåäü äîñòàòî÷íî çàëåçòü â php.ini è íàñòðîèòü âûâîä ïðåäóïðåæäåíèé. Íî è çäåñü íå âñå òàê ïðîñòî. Ìîåìó çíàêîìîìó PHP-ïðîãðàììèñòó íåäàâíî ïîçâîíèë ðàáîòîäàòåëü, ó êîòîðîãî çàâèñ ñàéò.  ðåçóëüòàòå âûÿñíèëîñü, ÷òî õîñòåð îáíîâèë PHP ñ âåðñèè 4.3.6 äî 4.3.8, â êîòîðîé ïðåäóïðåæäåíèÿ îá èñïîëüçîâàíèè íåîáúÿâëåííûõ ïåðåìåííûõ îêàçàëèñü ïî óìîë÷àíèþ âêëþ÷åíû.  èòîãå ñàéò ñòàë ïðåäñòàâëÿòü ñîáîé ñáîðíèê âñåâîçìîæíûõ ïðåäóïðåæäåíèé îò äâèæêà PHP, ïîñêîëüêó ïðèÿòåëü, ïðèâûêíóâ ê ðàâíîäóøèþ PHP, íèêîãäà íå çàòðóäíÿë ñåáÿ îáúÿâëåíèåì ïåðåìåííûõ.
Êàê ïðàâèëî, îáíîâëåíèå âåðñèè ÐÍÐ íà ñåðâåðå - ãîëîâíàÿ áîëü è äëÿ çàêàç÷èêîâ, è äëÿ ïðîãðàììèñòîâ. Ïîðîé íàéòè îøèáêó î÷åíü òðóäíî, îñîáåííî åñëè îíà ïîÿâëÿåòñÿ ëèøü ïðè îïðåäåëåííûõ îáñòîÿòåëüñòâàõ, òàê ÷òî åå ìîæíî âîîáùå íå âûÿâèòü äî ñäà÷è ïðîåêòà.  ýòîì è ñèëà, è ñëàáîñòü ÐÍÐ. Ïîêà â Ñ# âû áóäåòå çàíèìàòüñÿ ïëàíèðîâàíèåì, ïèñàòü ðàçíûå êëàññû, èíòåðôåéñû äëÿ êîëëåêöèé è ïðî÷àÿ è ïðî÷àÿ, ÷òîáû ïîòîì îäíèì ìàõîì çà äåñÿòü ìèíóò ñäåëàòü ñòðàíèöó, - â ÐÍÐ âû òó æå ñòðàíèöó óñïååòå íàïèñàòü íåñêîëüêî ðàç. Òîëüêî âîò êàæäàÿ ñëåäóþùàÿ ñòðàíèöà íà ASP.NET äåëàåòñÿ ëèøü çà äåñÿòü ìèíóò, à â ÐÍÐ ñíîâà è ñíîâà ïðèäåòñÿ çàòðà÷èâàòü òî æå ñàìîå âðåìÿ. Íóæíî âèçóàëüíî â âûâîäå ÷òî-òî íà ñòðàíèöå èçìåíèòü - â ASP.NET ïîíàäîáèòñÿ ïÿòü ìèíóò, à â ÐÍÐ - ïðèäåòñÿ èñêàòü è ïðàâèòü âûâîä HTML. PHP-ïðîãðàììèñò ïðåäïî÷òåò ñêîðåå ïåðåïèñàòü âñå çàíîâî, à â ASP.NET ïðîãðàììèñò áóäåò âûíóæäåí èñïîëüçîâàòü ãîòîâûå íàðàáîòêè. Èíà÷å åãî ïðîñòî íå âîçüìóò íà ðàáîòó. Íà òàêîì êîëëåêòèâèçìå, êîãäà èíäèâèäóàëüíîñòü ïðîãðàììèñòà íèâåëèðîâàíà äî ïðåäåëà, è ïîñòðîåíà âñÿ ôèëîñîôèÿ .NET, è ýòà ôèëîñîôèÿ, ïîâòîðþñü, ïðåêðàñíî äåéñòâóåò â áîëüøîì êîëëåêòèâå. À èíäèâèäóàëüíîñòü è ïðîñòîòà ÐÍÐ-ïðîãðàììèðîâàíèÿ - â ìàëåíüêîì.
Ýòîò ôàêò õîðîøî îòðàæàåò ñèòóàöèÿ íà ðûíêå òðóäà: ñîîòíîøåíèå ÐÍÐ- è ASP.NET-ïðîãðàììåðîâ ñåé÷àñ ñîñòàâëÿåò 3:2, ÷òî ãîâîðèò êàê î äîñòóïíîñòè áåñïëàòíûõ ïðîäóêòîâ, òàê è î áîëüøîì êîëè÷åñòâå íåáîëüøèõ, íî àìáèöèîçíûõ ïðîåêòîâ, äëÿ êîòîðûõ PHP ïîäõîäèò èäåàëüíî. Èíàÿ ñèòóàöèÿ, íàïðèìåð, â Èçðàèëå (òàì ñîîòíîøåíèå ïðèìåðíî 1:10), Àìåðèêå è Åâðîïå.
Çàðàáîòîê ASP.NET-ïðîãðàììèñòà òîæå âûøå, è åñëè õîðîøèé PHP-ïðîãðàììèñò ïîëó÷àåò ó íàñ â ëó÷øåì ñëó÷àå 800, íó ìàêñèìóì 1000 äîëëàðîâ (èíôîðìàöèÿ ñ www.job.ru), òî çàðïëàòà ASP.NET-ïðîãðàììèñòà, êàê ïðàâèëî, íà÷èíàåòñÿ ñ 800 äîëëàðîâ. Îíî è ïîíÿòíî - îòâåòñòâåííîñòè áîëüøå, ðàáîòû áîëüøå, ãåìîððîÿ áîëüøå, ñâîáîäû ìåíüøå.
Èòàê, ìàëåíüêèå è ñðåäíèå ïðîåêòû - óäåë ìàëåíüêèõ ãðóïï ïðîãðàììèñòîâ è PHP; ñðåäíèå è áîëüøèå - óäåë áîëüøèõ ãðóïï, èñïîëüçóþùèõ ïðîäóêòû Microsoft (Ýòî êàêàÿ-òî ëîæíàÿ äèõîòîìèÿ. Ìîæíî ïîäóìàòü, ÷òî â ìèðå åñòü òîëüêî PHP è ASP.NET. Ìàññà êðóïíûõ ïðîåêòîâ ñäåëàíà íà Perl, êîòîðûé ëèøåí ïåðå÷èñëåííûõ íåäîñòàòêîâ PHP è ïðåêðàñíî ðàáîòàåò. - Ïðèì. ðåä), à òàêæå î÷åíü íåìíîãî÷èñëåííûõ õîðîøî îðãàíèçîâàííûõ ãðóïï ïðîãðàììèñòîâ íà ÐÍÐ; ãèãàíòñêèå ïðîåêòû äåëÿò ìåæäó ñîáîé ïðîäóêòû HP, IBM, Sun, Oracle, è ðàñöåíêè òàì â íåñêîëüêî ðàç âûøå. Íî ýòî óæå ñîâåðøåííî äðóãàÿ èñòîðèÿ.
×òî âûáðàòü íà÷èíàþùåìó ïðîãðàììèñòó? Çàòðóäíÿþñü îòâåòèòü îäíîçíà÷íî. ÐÍÐ, êîíå÷íî, ïðîùå: íî ÿ âñå-òàêè ñîâåòîâàë áû èçó÷àòü ASP.NET, ó íåãî àáñîëþòíî òî÷íî åñòü áóäóùåå â ñðåäíèõ è êðóïíûõ êîìïàíèÿõ, ÷åãî íå ñêàæåøü î ÐÍÐ. Îòìå÷ó òàêæå, ÷òî ñèòóàöèÿ íà ðûíêå òðóäà âñåãî ëèøü ãîä-ïîëòîðà íàçàä áûëà ïðèìåðíî 1:9 â ïîëüçó ÐÍÐ, è ðàäèêàëüíîå èçìåíåíèå ýòîãî ñîîòíîøåíèÿ íå ìîæåò íå íàñòîðîæèòü.
Åñëè æå ïîâåçåò è åñëè òû äåéñòâèòåëüíî õîðîøèé ïðîãðàììèñò - ìîæíî ïîïàñòü â "ñîâåðøåííî äðóãóþ èñòîðèþ", ãäå è çàðïëàòà ñîâåðøåííî äðóãàÿ. Ýòîìó ìîæåò ñïîñîáñòâîâàòü ó÷àñòèå â ðàçëè÷íûõ êîíêóðñàõ, ïðîâîäèìûõ êîìïàíèÿìè (ïîïàñòü òóäà èíûì ïóòåì, áåç ñåðüåçíûõ íàðàáîòîê íà ñòîðîíå, î÷åíü òðóäíî).
Ïðåäëàãàþ âàì äâà âàðèàíòà (íà ASP.NET è íà PHP) îäíîé è òîé æå ïðîñòåíüêîé ïðîãðàììêè. Îáà íàïèñàíû â ëîá (ñïåöèàëüíî) è ðåøàþò îäíó è òó æå çàäà÷ó: ïîäñ÷èòûâàþò, ñêîëüêî ðàç òà èëè èíàÿ áóêâà âñòðå÷àåòñÿ âî ââåäåííîé ñòðîêå.
ASP.NET:
private void Button0_Click(object sender, System.EventArgs e){string alphabyte= "ABCDEFGHIJKLMNOPQRSTUVWXYZÉÖÓÊÅÍÃØÙÇÕÚÔÛÂÀÏÐÎËÄÆÝß×ÑÌÈÒÜÁÞ¨";int[] counter =new int[alphabyte.Length];//Ìàññèâ-ñ÷åò÷èêstring Text=TextBox1.Text;//Çàáèðàåì äàííûåText=Text.ToUpper();//Ââåäåííûé òåêñò ê âåðõíåìó ðåãèñòðóforeach (char t in Text)//Èäåì ïî ñòðîêå êàê ïî ìàññèâó{//Èäåì ïî ìàññèâó-ñ÷åò÷èêófor (int i=0; i<alphabyte.Length;i++){//Åñëè òåêóùàÿ áóêâà â ñòðîêå ðàâíà áóêâå â àëôàâèòå,// òî óâåëè÷èâàåì ìàññèâ-ñ÷åò÷èê íà åäèíèöó äëÿ òåêóùåãî ïîëîæåíèÿif (t==((char)alphabyte[i])) counter[i]++;}}//Âûâîäfor(int i=0; i<counter.Length;i++){if (count[i]!=0){Response.Write("Áóêâà "+alphabyte[i]+" âñòðå÷àåòñÿ "+ Convert.ToString(count[i])+" ðàç <BR>");}}}
ß ñïåöèàëüíî óáðàë ôàéë ñ øàáëîíàìè è òåêñò, êîòîðûé àâòîìàòè÷åñêè ãåíåðèðóåòñÿ Visual Studio. Çäåñü òîëüêî òî, ÷òî íàïèñàíî "ðóêàìè"; ðåàëüíûé òåêñò ïðîãðàììû ðàç â ïÿòü áîëüøå. ß ñäåëàë ýòî, ÷òîáû ïîêàçàòü, êàê ðàáîòà ñ ñîáñòâåííî HTML â ASP.NET íàìåðåííî ñâîäèòñÿ ê íåîáõîäèìîìó ìèíèìóìó (â äàííîì ñëó÷àå - ê îáðàáîò÷èêàì ñîáûòèé, êàê â îáû÷íîì âèçóàëüíîì ÿçûêå ïðîãðàììèðîâàíèÿ). Òàêèì îáðàçîì, ñòàíîâèòñÿ âîçìîæíîé ïîëíîñòüþ ðàçäåëüíàÿ ðàáîòà ïðîãðàììèñòîâ è äèçàéíåðîâ, êîãäà äëÿ ðàäèêàëüíîé ñìåíû äèçàéíà ïðîãðàììèñò, êàê ïðàâèëî, íå íóæåí.  ÐÍÐ ýòî òîæå ìîæíî ðåàëèçîâàòü ïóòåì ïðèìåíåíèÿ øàáëîíîâ, íî çàìåòíî áîëüøåé êðîâüþ.
À òåïåðü òîò æå êîä íà ÐÍÐ:
<form action="test.php" method="POST">Ââåäèòå ñëîâî<input type="text" name="str"><input type="submit" name="submit" value="Ïîñ÷èòàòü"><?php$quiz_string=$_POST['str'];if (strlen($quiz_string)!=0){$alphabyte='QWERTYUIOPASDFGHJKLZXCVBNMÉÖÓÊÅÍÃØÙÇÕÚÔÛÂÀÏÐÎËÄÆÝß×ÑÌÈÒÜÁÞ¨';$quiz_string= $quiz_string.strtoupper($quiz_string);for ($i=0; $i<strlen(quiz_string);$i++){for ($j=0; $j<strlen($alphabyte);$j++){if ($alphabyte[$j]==$quiz_string[$i]) {$result[$j]+=1;}}}echo '<br>';for ($j=0; $j<strlen($alphabyte);$j++){if (strlen($result[$j])!=0) {echo "Áóêâà $alphabyte[$j] âñòðå÷àåòñÿ $result[$j] ðàç<BR>";}//echo $quiz_string;}}?></form>
Î÷åâèäíî, ÷òî â ÐÍÐ ïðàâèò áàëîì äèíàìè÷åñêèé âûâîä HTML, òîãäà êàê â ASP.NET äåëàíî âñå, ÷òîáû ïðîãðàììèñò ïî âîçìîæíîñòè âîîáùå íå äóìàë îá HTML.
ASP.NET: ïîíà÷àëó òåìïû ðàçðàáîòêè äîëæíû ðåçêî ïàäàòü, ïîòîì ñòàáèëüíî ðàñòè è â êîíöå êîíöîâ îñòàíîâèòüñÿ íà îïðåäåëåííîì óðîâíå.
PHP: ïðè äîñòàòî÷íî áîëüøîì îáúåìå êîäà òåìïû ðàçðàáîòêè äîëæíû ïàäàòü ñ íà÷àëüíî î÷åíü âûñîêîãî óðîâíÿ, ïðè÷åì íå óäèâëþñü, åñëè ñêîðîñòü ïàäåíèÿ áóäåò ïðîïîðöèîíàëüíà êâàäðàòó îáúåìà êîäà.
| Ðóáðèêè: | web-êîäèíã |
Ìîè óøêè ëàñêàåò - Armin van Buuren - A State of Trance 437-NET-2009-12-31-iRUSH| Êîììåíòèðîâàòü | « Ïðåä. çàïèñü — Ê äíåâíèêó — Ñëåä. çàïèñü » | Ñòðàíèöû: [1] [Íîâûå] |