There are two TAB’s in Emacs, (kbd "TAB") (\t, [9]) and (kbd "<tab>") ([tab]). If modes like yasnippet and auto-complete want to bind on TAB, their trigger key must be the same with the original Tab command. Since Emacs binds indent-for-tab-command on (kbd "TAB"), so it’s better to use it as the trigger key. Yasnippet binds to it by default, It is also easy to setup auto-complete to trigger using Tab.

;; trigger using TAB and disable auto start
(custom-set-variables
 '(ac-trigger-key "TAB")
 '(ac-auto-start nil)
 '(ac-use-menu-map t))

But in some modes (ruby-mode, markdown-mode, org-mode), the command is bind to (kbd "<tab>"), when the real Tab key is typed, the function bind on (kbd "<tab>) has higher priority, so yasnippet and auto-complete are not invoked. It is easy to fix by moving the keybinding:

(defun iy-tab-noconflict ()
  (let ((command (key-binding [tab]))) ; remember command
    (local-unset-key [tab]) ; unset from (kbd "<tab>")
    (local-set-key (kbd "TAB") command))) ; bind to (kbd "TAB")
(add-hook 'ruby-mode-hook 'iy-ac-tab-noconflict)
(add-hook 'markdown-mode-hook 'iy-ac-tab-noconflict)
(add-hook 'org-mode-hook 'iy-ac-tab-noconflict)