Thursday, June 25, 2015

Би Програмист уу? Хөгжүүлэгч үү? эсвэл Инженер үү?

Хэсэг хугацаанд бодсоны эцэст өөрсдийн мэргэжлийн зарим нэг ойлголтыг өнгөрсөн хугацаанд мэдэрсэн мэдрэмж, ажилласан туршлага, интернетээс олж авсан, бас их сургуулийн багш нараасаа дуулж байснаар тодорхойлохыг оролдоё. Мэдээж хүн бүрт өөр өөрийн гэсэн тайлбар байгаа гэж бодож байна. 

Яагаад энэ талаар бичих болсон шалтгаан маань дараах хэдэн зүйлээс үүссэн юм. Үүнд:

1. Ихэнх хүмүүст (ялангуяа өөр мэргэжлийн хүмүүст) өөрийн ямар мэргэжилтэйг тайлбарлахдаа Програмист гэж хэлдэг. Өөр олон нэр томьёог хэлэхэд ойлгохгүй санагддаг. Жишээ нь: Компьютер инженер, програм хангамжийн инженер, хөгжүүлэгч г.м.

2. Програм хангамжийн компаниуд хүртэл ажилд хүн авахдаа програмист авна гэсэн зарыг ихээр тавьсан байдаг. Мэдээж зарим нь өөр нэр томьёог ашигласан байдаг л даа. Гэтэл тухайн компанид үнэхээр програмист хэрэгтэй юу? эсвэл програм хангамж хөгжүүлэгч үү?, програм хангамжийн инженер үү? гэдгээ нарийн тодорхойлвол хэрэгтэй юм шиг. 

3. Мөн хувийнхаа кариерын хувьд би цаашдаа яг ямар чадвар, мэргэжилтэй болох вэ? гэдгээ зөв тодорхойлоод түүнийхээ төлөө суралцаж, туршлагажих шаардлагатай юм шиг.

Иймээс дараах байдлаар тодорхойлох гээд үзье.

1. Програмист (Programmer)

Ерөнхийдөө ямар нэгэн програмчлалын хэлийг сайн эзэмшсэн, түүгээрээ оноож өгсөн ажлыг хэлсэн загварчлалынх нь дагуу хийдэг хүнийг хэлээд байгаа. Боловсруулсан бичиг баримтыг ойлгох чадвартай, кодоо хэрхэн бичих логик буюу алгоритмын чадвартай, нэг ёсны бусад эх үүсвэрүүд дээр тодорхойлолсноор хэрхэн код бичихийг мэддэг хүн юм.

Компанийн зүгээс харахад програмист хүнийг аль хэдийн боловсруулсан програм хангамжийн дизайн, түүнийгээ нэгж ажил болгон жагсаагаад одоо кодчлоход бэлэн болсон ажлуудыг гүйцэтгүүлэх явдал юм.

Багш маань хэлэхдээ програмист гэдэг бол тухайн хүний эзэмшсэн нэг чадвар юм. Ямар ч мэргэжилтэй хүн хэрхэн код бичихийг сураад програмист болж болно гэсэн юм. Би бол үүнтэй санал нэг байдаг.

2. Хөгжүүлэгч (Developer)

Хөгжүүлэгчийн хувьд мэдээж дараагийн түвшний гэж хэлж болно. Програмистын чадварыг заавал эзэмшсэн байх шаардлагатай. Харин дээр нь нэмэгдэх зүйл бол програм хангамжийн дизайн гаргах, ямар архитектур ашиглан хөгжүүлж гүйцэтгэх, түүнийг хэрхэн хийх бичиг баримтыг боловсруулах, мөн бусад програмист болон хөгжүүлэгч нарын асуудлыг шийдвэрлэж, хэрхэн кодчилох болон кодын стандартыг, зарчмыг тодорхойлох гээд хамаагүй өөр түвшинд яригдаж байгаа юм.

Их сургуульд байхад энэ чиглэлийн аргачлалуудаас заадаг, сургадаг байсан. Програм хангамж хөгжүүлэх процесс, цикл гээд. (SDLC - Software Development Life Cycle) гээд. Эдгээрийг сурсанаар хэрхэн шаардлагаа тодорхойлох, дизайнаа боловсруулах, түүнийгээ кодчлох, шалгах, шалгалтаас гарсан үр дүнг хэрхэн тусгах гээд нилээдгүй хугацааг зарцуулж байсан. 

Мэдээж бодит практик дээр илүү судалгааг явуулж ямар аргачлалаар програм хангамж хөгжүүлэлтийг явуулах уу? аль алхамыг автоматжуулах уу? гээд их зүйлийг сурч авч байна. 

Миний хувьд ч анх төгсөөд програмист үүргийг гүйцэтгэж байгаад, энэ чиглэлрүү бага багаар орсон юм. Хамгийн гол нь олон ажлууд дээр ажиллаж байж түүнээсээ туршлага аван дараа дараагийн түвшинд шилжинэ.

Ийм чадварыг эзэмшсэн хүнийг компаниуд програм хангамжийн архитектур, дизайн боловсруулах, түүнийхээ техникийн бичиг баримтыг боловсруулах, шийдэл олж асуудлыг шийдвэрлэх зэрэг үүргээр сонгон шалгаруулж авах нь тохиромжтой юм шиг. Мөн дотоод хүний нөөцөө энэ чиглэлрүү сургах нь илүү тохиромжтой.

3. Инженер (Engineer)

Инженер гэхээр илүү том сэдэв рүү ороод байгаан. Миний бодлоор дээрх програмист, хөгжүүлэгчийн чадваруудыг бүрэн эзэмшсэн байх шаардлагагүй ч эдгээрийн талаар маш сайн ойлголттой байх ёстой. Яагаад гэвэл томоохон хэмжээний системүүдийг боловсруулахад дан ганц програм хангамжийнхаа архитектураас гадна серверүүдийг хэрхэн зохион байгуулах, сүлжээний бүтэц ямар байх шаардлагатай, тэдгээрийг хамгийн тохиромжтойгоор хэрхэн суурилуулах, бусад интерпрайс системүүдтэй хэрхэн, ямар протоколоор холбогдох, системүүдийн дотоод компонент болон модулиуд нь цаашид өргөжих байдал нь ямар байх, технологийн өөрчлөлтийг хэрхэн хамгийн хурданаар тусгах гээд бүхий л түвшиний асуудлыг хамраад байгаан. 

Мөн бас нэг чухал ойлголт нь аливаа програм хангамж нь өгөгдөл дээр суурилан үйл ажиллагаагаа явуулдаг учир өгөгдлийн архитектурыг зөв тодорхойлох, хэдэн сая өгөгдлийг хэрхэн байршуулж, хурдан хугацаанд статистик тайланг авах. Cluster, Partition, Index зэргийг зөв тодорхойлох гээд судлах сурах зүйл их байгаан.

Энэ төрлийн хүнийг компаниуд системийнхээ том архитектурыг боловсруулах, технологийн сонголтуудыг тодорхойлох, компонент болон модулиудын хоорондын уялдаа холбоог гаргах, техникийн бичиг баримтыг бичих зэрэг чухал албан тушаалаар авдаг байна. 


Иймэрхүү байдлаар эдгээр нэрний утга учрыг тайлбарлаад байж болох байх. Харин та бүхэнд ч зөндөө тайлбар байгаа гэдэгт итгэлтэй байна. Хамгийн чухал нь бид нэг ойлголттой байж бусад хүмүүст хүргэх нь чухал юм. Энийг хаанаас хүргэх нь одоогоор тодорхойгүй байна. Тиймээс ядаж өөрийн блог дээрээ, өөрийн тайлбарыг бусад эх үүсвэртэй хослуулан хүргэж байна. 

Хүндэтгэсэн,
Эрдэнэбаяр

Linkedin: http://www.linkedin.com/in/erdenebayare

Friday, June 19, 2015

AES Encryption and Decryption with Oracle Database

Сайн байцгаана уу?

Удаан хугацаанд бичсэнгүй, өнгөрсөн хугацаанд судалсан зүйлүүдээсээ хуваалцаж эхлье. Өнөөдрийн хувьд Oracle мэдээллийн сан дээр AES - аар хэрхэн мэдээллээ нууцлах болон сэргээх талаар орууллаа.

Магадгүй нууцлах шаардлагатай мэдээлэлтэй хүмүүс байвал санаа авч болохын.

Хамгийн эхлэн тухайн хэрэглэгчдээ crypto эрхийг оноож өгөх шаардлагатай.

 grant execute on dbms_crypto to YOUR_USER;  

Үүний дараа шифрлэх болон сэргээх хоёр процедурыг мэдээллийн сандаа нэмэж өгсөнөөр бэлэн боллоо гэсэн үг.

 create or replace FUNCTION sec_return_encrypted_data(data IN VARCHAR) RETURN RAW IS  
   key VARCHAR(16) := 'A1B2C3D4E5F6G7H8';  
   encryption_mode NUMBER := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;  
   BEGIN        
      RETURN DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW (data, 'AL32UTF8'),   
       encryption_mode, UTL_I18N.STRING_TO_RAW(key, 'AL32UTF8') );  
   END;  

 create or replace FUNCTION sec_return_decrypted_data(data IN RAW) RETURN VARCHAR IS  
   key VARCHAR(16) := 'A1B2C3D4E5F6G7H8';  
   encryption_mode NUMBER := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;  
   BEGIN  
      RETURN UTL_RAW.CAST_TO_VARCHAR2(DBMS_CRYPTO.DECRYPT  
       (data, encryption_mode, UTL_I18N.STRING_TO_RAW(key, 'AL32UTF8')));  
   END;  

Анхаарах ёстой зүйл нь шифрлэсэн өгөгдөл нь RAW өгөгдлийн төрөлтэй байх ёстой. Мөн шифрлэх төрлийг тохируулахдаа дээр харуулсан аргачлалыг сонгосон ба өөр олон хослолыг хэрэглэж болох санагдсан. (DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC  + DBMS_CRYPTO.PAD_PKCS5).

AES алгоритм нь key шаардлагатай байдаг ба энийг хэрэгжүүлж байгаа хүн нь процедурлуугаа гаднаас дамжуулах, өөр газар хадгалах гээд олон аргаар шийдэж болох байх.

За тэгээд сайжруулалтыг хүн бүр өөрийнхөөрөө судлан нэмэх боломжтой санагдаж байна.

Хүндэтгэсэн,
Эрдэнэбаяр

Linkedin: http://www.linkedin.com/in/erdenebayare
Twitter: http://twitter.com/#!/erdenebayare