advanced programming techniques